什么是闭包?
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
总结
当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包
发表回复