闭包是什么
MDN的解释:
closure is the combination of a function and the lexical environment within which that function
was declared.闭包,是一个变量所声明的函数+它的词法作用域的结合。
JavaScriptKit的解释
A closure is the local variables for a function - kept alive after the function has returned
闭包对于函数来说是个本地变量,这个变量是当这个函数返回的时候,变量还存在。闭包,能访问当前函数外的变量。
《JavaScript高级程序设计》的解释:
闭包是一个函数,指有权访问另一个函数作用域中的变量的函数。
《JavaScript权威指南》的解释:
从技术的角度讲,所有的JavaScript函数都是闭包。它们都是对象,它们都关联到作用域链。
简单理解
一个作用域可以访问另外一个函数内部的局部变量。
用代码实现闭包
function fn() {
var num = 10; // 闭包可访问的上级作用域的变量
function fun() {
console.log(num);
}
return fun; // 返回一个函数
}
var f = fn(); // 接收这个返回的函数
f(); // 调用返回的函数
闭包的用途
- 可以读取函数内部的变量
- 让这些变量的值始终保持在内存中,不会在被调用后被自动清除
闭包的优点
- 逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
- 方便调用上下文的局部变量。
- 加强封装性,是第2点的延伸,可以达到对变量的保护作用。
闭包的缺点
- 其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏, 解决方法 : 可以在使用完变量后手动为它赋值为null
- 由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
闭包的特性
- 作为函数变量的一个引用。当函数返回时,其处于激活状态
- 闭包就是当一个函数返回时,并没有释放资源的栈区。
闭包的工作原理
因为闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。多个函数可以使用同一个环境,这使得他们可以通过改变那个环境相互交流