一句话
JavaScript中的闭包是一个类型的应用,ta的原理是变量解析。
原理
每次定义一个函数,都会产生一个作用域链(scope chain)。
为什么强调函数?这意味着当你保留一个函数的引用时,也会保存ta的作用域链。包括其中的上层函数的变量等等。
如:
//有这么一坨可爱的家人
F 爷爷() {
var 小明;
F 爸爸(){
//给小明吃棒棒糖
}
}
爷爷() //执行爷爷函数,小明出现,小明吃完帮帮糖后,函数结束,清内存,小明消失了
爷爷() //同上
怎么样让小明记住自己吃了多少次糖呢?
我们需要保留一个函数的引用,保存小明。
爷爷?每次运行爷爷都会”var 小明;“,
爸爸!只要想办法保留爸爸的引用,爷爷只会执行一次,这样就可以对同一个小明多次喂糖了。(计数器)
//有这么一坨可爱的家人
F 爷爷() {
var 小明;
return F 爸爸(){
//给小明吃棒棒糖
return 小明;
}
}
var 李刚=爷爷()//此时李刚是爸爸的引用
李刚() //由于爸爸引用始终存在,作用域链的原因,爷爷不会被内存清掉
。。。
李刚=null //不引用爸爸了,删除闭包
看下实例
//这样可以
function add() {
var count=0;
return function() {
count = count +1;
return count;
}
}
var x=add()
num=x(); //num=1;
num=x(); //num=2;
//另一种写法
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add(); //counter=1
add(); //counter=2
add(); //counter=3
//x不是inner函数的引用,而是count。
//这样不管执行多少次x(),返回值始终为1。
function add() {
var count=0;
return function() {
count = count +1;
return count;
}
}
var x=add()()
num=x; //num=1;
num=x; //num=1;
//x是outer函数的引用,执行完后,内存就会清除
//这样不管执行多少次x(),返回值始终为1
function add() {
var count=0;
return function() {
count = count +1;
return count;
}
}
var x=add
num=x()(); //num=1;
num=x()(); //num=1;
参考
https://www.cnblogs.com/wx1993/p/7717717.html
https://www.zhihu.com/question/34547104
https://www.w3school.com.cn/js/js_function_closures.asp