JS闭包

99 阅读1分钟

闭包

什么是闭包

闭包(closure)指有权访问另一个函数作用域中变量的函数。----------------- JavaScript 高级程序设计

一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。--------------------- MDN

简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。

举例说明如下:

function fn() {      //  fn就是闭包
    var num = 1;     // num 是一个被 fn 创建的局部变量
    function fun() { // fun 是一个内部函数
        console.log(num); // 使用了父函数中声明的变量
    }
    return fun();
}
fn(); // 1

闭包的作用

  • 延伸变量的作用范围。 下列代码可以从fn外部得到fn内部的局部变量num
 function fn() {
     var num = 10;
     return function () {
         console.log(num); // 10
     };
 }
 var f = fn();
 f();
  • 函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,如果创建了一个闭包的话,这个函数的作用域就会一直保存到闭包不存在为止。
 function fn() {
     var num = 10;
     return function () {
         console.log(num); // 10
     };
 }
 var f = fn();
 f();

还是这一段代码,fn形成闭包的作用域,其中的变量会保留下来。

不当使用闭包的弊端

使用闭包可以使当前上下文不被释放,则当前上下文中的私有变量和值会被保存。但是如果大量使用闭包,会导致栈内存不断增大,页面渲染变慢,影响程序性能,严重会造成内存泄漏;所以应该合理使用闭包。