在一般的教程里,都谈到子作用域可以访问到父级作用域,进而访问到父级作用域中的变量,具体是如何实现的,就不得不提及到函数堆栈和执行上下文。
举个例子,一个简单的闭包:
 
首先,我们可以知道,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. CentOS -- Zookeeper installation and configure

    1 JDK 1.8 must installed first 2 Get Zookeeper package wget https://archive.apache.org/dist/zookeepe ...

  2. Docker Machine的使用

    前面两篇文章(<Asp.Net Core 发布到 Docker(Linux Centos 虚拟机,使用Dockerfile)> <Docker Compose的使用>),简单介 ...

  3. 安装Python及各种包/库——没有网络的电脑上

    我们做项目时可能会遇到,一些电脑只能联内网或者无法联网,这种情况怎样在电脑上安装Python及各种第三方包/库呢? 1.首先,在有网络的电脑上在python官网下载好python安装包,地址:http ...

  4. 牛客小白月赛5 E 面积 计算三角形面积模板 波尔约-格维也纳定理 匹克公式

    链接:https://www.nowcoder.com/acm/contest/135/E来源:牛客网 题目描述 定义“最大生成图”:在M*N的点阵中,连接一些点形成一条经过所有点恰好一次的回路,且连 ...

  5. atcoder D - 11(组合数学)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_b 题解:有n+1个数只有一个数字是有重复出现的,要求一共有多少不同的组合显然和这两个数的位置有关 ...

  6. 详解RMQ-ST算法 ST模板

    RMQ问题是求解区间最值的问题. 这里分析的是ST算法,它可以对所有要处理的数据做到O(nlogn)的预处理,对每个区间查询做到O(1)查询 ST算法本质是一个DP的过程 这里通过举一个求最大值实例来 ...

  7. 【Offer】[44] 【数字序列中某一位的数字】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 数字以0123456789101112131415..的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是 ...

  8. IDEA中运行测试方法

    1. 2. 3. 4. 5.

  9. Unity基础:AR(增强现实)的学习

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  10. MySQL中几个重要的文件

    一.数据库层面 错误日志文件(error log) 二进制日志文件(binary log) 慢查询日志(slow log) 全量日志(general log):general log 会记录MySQL ...