闭包

129 阅读2分钟

闭包是什么

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(); // 调用返回的函数

闭包的用途

  1. 可以读取函数内部的变量
  2. 让这些变量的值始终保持在内存中,不会在被调用后被自动清除

闭包的优点

  1. 逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
  2. 方便调用上下文的局部变量。
  3. 加强封装性,是第2点的延伸,可以达到对变量的保护作用。

闭包的缺点

  1. 其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏, 解决方法 : 可以在使用完变量后手动为它赋值为null
  2. 由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

闭包的特性

  1. 作为函数变量的一个引用。当函数返回时,其处于激活状态
  2. 闭包就是当一个函数返回时,并没有释放资源的栈区。

闭包的工作原理

因为闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。多个函数可以使用同一个环境,这使得他们可以通过改变那个环境相互交流