闭包

好难啊!

虽然感觉懂了,但是又感觉不懂……

什么时候使用闭包: 只要重用一个变量,又保护变量不被污染时

步骤: 3步:

 1. 用外层函数包裹要保护的变量和操作变量的函数

 2. 外层函数将内层函数的对象返回到外部

 3. 使用者调用外层函数,获得内层函数对象

闭包的形成原因: 外层函数的作用域对象(AO)无法释放

  被内层函数对象引用着

简图: 2步:

 1. 找受保护的变量,并确定其最终值

 2. 找使用变量的内层函数对象,只有内层函数才能使用受保护的变量

闭包缺点: 比普通函数占用更多内存空间!

  解决: 闭包不再使用,要及时释放

    如何释放: 将引用内层函数对象的变量赋值为null

<script>
//1、用外层函数包裹要保护的变量和内层函数
function outer(){
var i = 1;//保护
//2、外层函数将内层函数返回到外部
return function(){//使用变量的函数
console.log(i++);
}
}
//3、使用者调用外层函数获得内层函数的对象
var getNum = outer();
//getNum:function(){console.log(i++); }
//i本该被释放!
getNum();//1
getNum();//2
i = 1;//全局变量改不了局部i,即局部i被保护
getNum();//3
getNum();//4
</script>

<script>
function fun(){
var n = 999;
nAdd = function(){n++;}
return function(){
console.log(n);
}
}
var get = fun();
//get:function(){console.log(n);}
get();//999
nAdd();
get();//1000
</script>

原文地址:https://www.cnblogs.com/wangruifang/p/7376680.html