闭包的理解
闭包就是外部函数访问内部函数的变量。要理解闭包,就要理解作用域链。什么是作用域?作用域就是执行期上下文对象的集合。函数每次执行的时候就会创建自己的执行上下文,执行完后就销毁。查找变量的时候从作用域的顶端往下查找。闭包呢就是将函数内部的变量保存在了外部,内部函数执行完之后,销毁自己的执行期上下文,但是他自己的执行期上下文也被外部函数带着的,保存在了自己的作用域链上,当外部调用函数时就会在作用域链上找变量,因此可以访问其变量。
举个栗子:
function a(){
function b(){
var bbb = 234;
document.write(aaa);
}
var aaa = 123;
return b;
}
var glob = 100;
var demo = a();
demo();
看图就是a在return b后就执行完了销毁了自己的上下文,相当于剪断[[scope chain]]0的线,但是b那里还有,函数b已经被保存在外面了,还是能在自己的上下文访问到函数a里面的变量,并且b上下文里面的a AO和a自己的AO是一样的,如果变量更改了,那么这两个同时更改。
这样就导致了闭包的缺点
闭包会导致原有作用域链不释放造成内存泄露
什么是内存泄露?我们可以理解为:闭包产生的变量会存在内存里,内存的剩余量会越来越少。这样理解就可以了。
闭包的作用
闭包实现公有变量,如函数累加器。
function test(){
var count = 0;
function b(){
count ++;
console.log(count);
}
return b;
}
test();//每次执行都会在原有的基础上加1
闭包可以做缓存。
function eater(){
var food = "";
var obj = {
eat:function(){
console.log(' i eat ' +food);
food = "";
},
push:function(myFood){
food = myFood;
}
}
return obj;
}
var eat1 = eater();
eat1.push('banana');
eat1.eat();
闭包可以实现封装,属性私有化。
闭包可以防止污染全局变量。