JavaScript闭包
闭包
- 函数嵌套函数, 内部函数可以引用外部函数的参数和变量(突破作用域链), 参数和变量不会被垃圾回收机制回收
可以理解为是联系函数内部和函数外部的桥梁 - 注意:
- 闭包会使得函数中的变量都被保存在内存中, 内存消耗很大, 所以不能滥用闭包, 否则会造成网页的性能问题. 尽量在退出函数之前, 将不使用的局部变量全部删除
- 闭包会在父函数外部改变父函数内部变量的值, 所以如果把父函数当做对象(object)使用, 把闭包当做它的公用方法, 把内部变量当做它的私有属性, 这时不要随便改变父函数内部变量的值
以下有三种方式:
- 直接定义函数
<script>
function aaa(a){
var b = 5;
function bbb(){
a++;
b++;
alert(a);
alert(b);
}
// 返回内部函数
return bbb;
}
var ccc = aaa(10);
ccc(); //弹出11, 6
</script>
- 直接返回函数
<script>
function a(){
var num = 10;
return function(){
return num+1;
}
}
var aa = a();
alert(aa()); // 弹出11
</script>
- 把内部函数赋给变量
<script>
function a(){
var num = 10;
b = function(){
return num+1;
}
}
a();
alert(b()); // 弹出11
</script>
- 混合使用
<script>
function f1(){
var n=1;
test=function(){
n+=1;
};
function f2(){
alert(n);
};
return f2;
}
var res=f1();
res(); // 弹出 1
test();
res(); // 弹出 2
</s
- 迭代计数
<script>
function test(x){
var i=0;
var demo=function(){
return(x[i++]);
}
return demo;
}
var next=test(['a', 'b', 'c', 'd']);
alert(next()); // a
alert(next()); // b
alert(next()); // c
alert(next()); // d
</script>