美文网首页
JS进阶系列之闭包(2)

JS进阶系列之闭包(2)

作者: McRay | 来源:发表于2017-06-15 16:05 被阅读0次

刚刚总结完作用域链,我觉得很有必要马上对闭包总结一下,因为,之前也写过自己对闭包的理解,那时候只知道,闭包就是可以访问别的函数变量的函数,就是在函数里面的函数就叫做闭包,可是并没有深入探究,为什么,可以访问别的函数变量呢?直到,学习了JS的作用域链之后,就恍然大悟。

首先,来回顾一下,什么是作用域链吧。

作用域链就是由当前执行环境与上层环境的一系列变量对象组成,保证了当前执行环境对符合访问权限的变量和函数的有序访问。

那么什么是闭包呢?

闭包

关于闭包的定义,我在之前的文章里面已经讲过了,就是能够读取其它函数内部变量的函数,那么为什么闭包可以读取其它函数内部的变量呢?这里面就涉及到了作用域链

demo01
var fn = null;
function foo(){
      var a = 2;
      function innerFoo(){
               console.log(a);
      }
      fn = innerFoo();
}
function Bar(){
     fn();
}
foo();
Bar();

在这个例子里面,正常来说,按照作用域链的规则,在foo()函数的内部innerFoo()函数可以访问到,父级foo()的属性和方法,还有全局作用域下的属性和方法。这是因为,在innerFoo()的作用域链里面包含了fooECglobalEC的变量对象,所以有权限访问。
但是,之前讲过的垃圾回收机制提到,如果foo()方法执行完毕,应该释放内存,然后让垃圾回收机制回收,可是,为什么在Bar()里面依然能访问到fn()方法呢?

image.png

从上图可以看出,因为fn = innerFoo();这句语句,使得全局作用域下的变量fn保存了innerFoo()方法的引用,并且innerFoo()方法是依赖于foo()方法的,所以导致,foo()方法里面的局部变量都保存在了内存里面,没有被回收,这也是使用闭包不当的一个弊端,会导致内存泄漏
当执行Bar()方法的时候,Bar()的作用域链中包含了全局作用域下的变量对象,所以可以访问到foo()方法下的innerFoo(),这就是闭包的一个底层原理。

相关文章

  • JS进阶系列之闭包(2)

    刚刚总结完作用域链,我觉得很有必要马上对闭包总结一下,因为,之前也写过自己对闭包的理解,那时候只知道,闭包就是可以...

  • JS进阶系列之闭包

    我对闭包的理解就是:闭包就是能够读取其他函数内部变量的函数,可以把闭包简单理解为“定义在一个函数内部的函数”。 在...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • 关于JS闭包(JS闭包系列1)

    今天做笔试题,好多关于JS闭包问题,就整理出来,分享一下。 首先,引用下所谓的“官方解释”:所谓“闭包”,指的是一...

  • JS闭包

    JS闭包 闭包练习

  • to be better(个人记录一些点)

    看见别人整理的可研究的专题:【进阶 1 期】 调用堆栈【进阶 2 期】 作用域闭包【进阶 3 期】 this 全面...

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • js之闭包

    变量的作用域 在JavaScript中,函数内部可以读取全局变量。 但是,函数外部无法读取函数内部的局部变量。 这...

网友评论

      本文标题:JS进阶系列之闭包(2)

      本文链接:https://www.haomeiwen.com/subject/gifuqxtx.html