在一般的教程里,都谈到子作用域可以访问到父级作用域,进而访问到父级作用域中的变量,具体是如何实现的,就不得不提及到函数堆栈和执行上下文。
举个例子,一个简单的闭包:
 
首先,我们可以知道,example是一个函数构造器,我们是可以通过new来将他实例化成对象,但其实example实际上是一个对象的引用,function的原型继承(__proto__)是来自于Object的(Object.prototype),同时,我们知道函数是拥有作用域的,因此我们的new_ex是引用了这个function对象,并且访问到其的作用域,因此,我们可以得到返回值funcB。
接下来的new_ex(),我们在父级函数作用域中进一步进入到了子级函数作用域,由于闭包的性质,因此我们可以对counter进行操作,操作完后,我们会释放子级函数作用域,进而释放内存,但由于我们new_ex仍对父级函数对象保留着引用,因此父级函数作用域没有被垃圾回收机制所释放,进而保留在内存中,因此我们可以实现计数器的功能。
但一旦我们撤除new_ex的引用,将其指向null对象,原来的函数对象就会被释放掉,因为该函数对象已经没有被任何变量所引用,进入垃圾回收机制。
 
对于更加底层的闭包分析,个人的理解是在函数执行上下文执行的时候,解释器会进行VO(variable object)/AO(active object)机制(其中VO一般是全局执行上下文的,AO是函数执行上下文),将需要用到的变量存放到VO/AO中,并保存在函数执行上下文中,过程分为两步,创建期与执行期,创建期中,先声明变量和函数,变量为undefined,函数则为代码片段,到了执行阶段,变量会进行赋值(同时重新声明和赋值是允许的,可以改变数据类型,甚至函数变为原始值数据类型也是可以的),执行完后,假如返回子函数,由于子函数中的AO中含有父函数的AO的引用,因此即使父函数执行上下文结束了,在全局函数堆栈中退栈了,其AO中被子级引用的变量仍然会保留在执行上下文的顶部,不会被释放,除非父级AO完全没有被引用了,才会被释放。
其实也可以这样理解,这里的new_ex指向的是example函数中的返回值,即funcB,因为解释器发现new_ex这个引用所指向的funcB的AO中有funcA的变量引用,因此没有释放funcA中的counter变量,因此闭包就形成了。
合理地运用闭包,能减少全局变量的污染,进而控制变量的生命周期,控制好内存的分配,对程序是百利无一害的,但是如果闭包不善,造成内存问题,那就要好好检讨一下自己的代码功底了。
 
下一次有空会讲一讲自己对原型链的理解。

浅谈JavaScript的闭包原理的更多相关文章

  1. 浅谈JavaScript DDOS 攻击原理与防御

    前言 DDoS(又名"分布式拒绝服务")攻击历史由来已久,但却被黑客广泛应用.我们可以这样定义典型的DDoS攻击:攻击者指使大量主机向服务器发送数据,直到超出处理能力进而无暇处理正 ...

  2. 浅谈JavaScript中闭包

    引言 闭包可以说是JavaScript中最有特色的一个地方,很好的理解闭包是更深层次的学习JavaScript的基础.这篇文章我们就来简单的谈下JavaScript下的闭包. 闭包是什么? 闭包是什么 ...

  3. 浅谈JavaScript预编译原理

    这两天又把js的基础重新复习了一下,很多不懂得还是得回归基础,大家都知道js是解释性语言,就是编译一行执行一行,但是在执行的之前,系统会做一些工作: 1,语法分析: 2,预编译: 3,解释执行. 语法 ...

  4. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  5. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  6. [转载]浅谈JavaScript函数重载

     原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...

  7. TODO:浅谈pm2基本工作原理

    TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...

  8. JavaScript的闭包原理

    什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...

  9. Js(javaScript)的闭包原理

    问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.  小编 ...

随机推荐

  1. 2013-2014 ACM-ICPC Pacific Northwest Regional Contest B.Bones’s Battery

    题意略. 思路: 这个题目求的是第一个可行解,由此想到用二分试探的方式来解决. 现在讲讲怎么验证该解是否合理: 先用floyd求出两两之间的最短距离. dp[ i ][ j ]表示,i 到 j 至少要 ...

  2. FZU 2235

    中文题,题意略. 这个题点少坐标范围大,直接离散化后建图搞. 这个题目卡vector,真是一脸懵逼............ #include<stdio.h> #include<st ...

  3. java虚拟机10.内存模型与线程

    多任务处理在现代计算机操作系统中是一项必备的功能,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘 ...

  4. library not found for -ljpush-ios-3.2.1错误

    很多人在更新pod后报 library not found for -ljpush-ios-3.2.1(举例)错误,这其实是包含版本号类型错误. 究其原因:使用了版本号做库名字,pod升级后 Podf ...

  5. poj 1753 Flip Game(暴力枚举)

    Flip Game   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 52279   Accepted: 22018 Des ...

  6. CodeForces 758 D Ability To Convert

    Ability To Convert 题意:给你一个n进制的60位的数,但是由于Alexander只会写0->9,所以他就会用10来表示十而不是A(假设进制>10); 题解:模拟就好了,先 ...

  7. NOIP 2016 蚯蚓 题解

    一道有趣的题目,首先想到合并果子,然而发现会超时,我们可以发现首先拿出来的切掉后比后拿出来切掉后还是还长,即满足单调递增,故建立三个队列即可. 代码 #include<bits/stdc++.h ...

  8. 题解 UVA12716 GCD等于XOR GCD XOR

    规律题,打表找规律即可发现 a xor b >= a - b >= gcd(a, b), 如果 a xor b = gcd(a, b) = c 则 c = a - b 枚举倍数c和a判断b ...

  9. 每天学会一点点(HashMap实现原理及源码分析)

    HashMap实现原理及源码分析   哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希 ...

  10. 连接池你用对了吗?一次Unexpected end of stream异常的排查

    能收获什么? 更加了解TCP协议 Redis与客户端关闭连接的机制 基于Apache Common连接池的参数调优 Linux网络抓包 情况简介 近期迁移了部分应用到K8s中,业务开发人员反馈说,会发 ...