好难啊!
虽然感觉懂了,但是又感觉不懂……
什么时候使用闭包: 只要重用一个变量,又保护变量不被污染时
步骤: 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>