闭包

先看看简单的栗子

function fn1(){
    var n=999;
    function fn2(){
        alert(n); 
    }
    return fn2;
}
var result=fn1();
result(); // 999    

啥是闭包??

网友答:

  1. 闭包就是能够读取其他函数内部变量的函数
  2. 闭包归根结底个人认为只是一个作用域链的不同吧,其实理解了作用域链个人感觉不是太难
  3. 闭包就是将函数内部和函数外部连接起来的一座桥梁

其实也正如大家所言,闭包就是能够读取到函数内部的变量,同时让这些变量处于内存当中,不会被垃圾回收机制所回收。也正因此闭包也有缺点,浪费内存,所以要在退出函数后,将局部变量删除。不要随便在父函数外部改变父函数内部的变量。

摘抄几段话

  • 只要存在调用内部函数的可能,JavaScript就需要保留被引用的函数。而且JavaScript运行时需要跟踪引用这个内部函数的所有变量,直到最后一个变量废弃,JavaScript的垃圾收集器才能释放相应的内存空间
  • 当内部函数在定义它的作用域的外部被引用时,就创建了该内部函数的一个闭包。这种情况下我们称既不是内部函数局部变量,也不是其参数的变量为自由变量,称外部函数的调用环境为封闭闭包的环境
  • 从本质上讲,如果内部函数引用了位于外部函数中的变量,相当于授权该变量能够被延迟使用。因此,当外部函数调用完成后,这些变量的内存不会被释放(最后的值会保存),闭包仍然需要使用它们
  • 对外部函数的调用会创建这些闭包的新实例,同时也会创建新的封闭环境,本质上是创建了一个新对象,自由变量就是这个对象的实例变量,而闭包就是这个对象的实例方法

参考文章一、

原文地址:https://www.cnblogs.com/fire-passiontao/p/5942848.html