【js】what is 闭包

javascript/jquery

浏览数:81

2019-6-29

什么是闭包?
MDN给出的官方回答是“闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量

看代码

//一个函数里面包含了另一个函数,最后已返回值返回被包裹的的函数。
function func() {
    let a = 1;
    function closer(){
        console.log(a)
    }
    return closer
}
let b = func()
b() // 1

按照正常的js作用域,当func执行完后a已经被销毁,但是变量b仍然能够访问到它里面的变量。
这就是闭包的核心。当函数执行完后,被作为返回值函数保留在了作用域中。以至于里面的数据没有被销毁,仍然可以访问到。
闭包还有一个作用是模拟私有方法和变量。要知道,js是不支持定义私有方法和变量的。
通过这个类作为对象返回私有方法和属性,便可以保证它们只可以被Create所调用。

function Create(){
   var privateCounter = 0;
   function changeBy(val) {
     privateCounter += val;
   }
   return {
        increment: function() {
          changeBy(1);
        },
        decrement: function() {
          changeBy(-1);
        },
        value: function() {
          return privateCounter;
        }
    }   
}

闭包的缺点
由上文可知闭包的作用可以使数据保存在内存中。当滥用闭包,也会导致内存占用过多,影响性能

解决闭包的问题
当你已经确定某些数据不会再被调用时,可以把闭包删除或者设为null

总结
当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包

作者:someone