什么是闭包?
- 闭包就是函数内部的子函数
- 当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行
- 闭包就是能够读取其他函数内部变量的函数,在本质上是函数内部和函数外部链接的桥梁
- 函数和对其周围状态(词法环境)的引用捆绑在一起构成闭包(closure)
特点:
- 函数嵌套函数
- 函数内部应用函数外部的参数与变量
- 函数和变量不会被垃圾回收机制回收
优点:
- 保护函数内变量安全,实现封装,防止变量流入其他环境中发货所能命名冲突
- 在内存中维持一个变量,可以做缓存
- 匿名只执行函数可以减少内存消耗
缺点:
- 闭包设计跨域访问,会导致性能损失(解决方案:把跨域作用域变量存储在局部变量中,然后直接访问局部变量,减轻对执行速度的影响)
- 造成内存泄露:闭包会使函数中的变量一直保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法:使用完变量后,手动将它赋值为null ; - 包可能在父函数外部,改变父函数内部变量的值。
实例1
function funA(){ let a = 10; // funA的活动对象之中; return function(){ //匿名函数的活动对象; alert(a); } } let b = funA(); b(); //10
实例2
function outerFn(){ let i = 0; function innerFn(){ i++; console.log(i); } return innerFn; } let inner = outerFn(); //每次外部函数执行的时候,都会开辟一块内存空间,外部函数的地址不同,都会重新创建一个新的地址 inner(); inner(); inner(); let inner2 = outerFn(); inner2(); inner2(); inner2(); //1 2 3 1 2 3