1闭包
蓝色背景代表不是很明白。
1闭包会使得函数的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页性能问题。在IE中还可能导致内存泄漏。尽量在退出函数之前,讲不使用的局部变量全部删除。
2闭包会在父函数外部,改变父函数内部变量的值。所以如果你把父函数当作对象使用,把闭包当作他的公共方法,把内部变量当作它的私有属性,这是一定要小心,不要随便改变父函数内部变量的值。
3 有权访问另一个函数作用域内变量的函数都是闭包。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//情况1 陷阱
// function f(){
// var a=[];
// var i;
// for(i=0;i<3;i++){
// a[i]=function(){
// return i;
// };
// 这里返回的时函数引用而不是函数调用。函数不调用就不会执行
// }
// return a;
// }
// var test=f(); // 此事a[i]=[f,f,f] f是循环三次后的函数即i等于3的时候。for循环已经把i等于3了,而都是指向函数的引用没有调用。
// alert(test0); // 当开始调用的时候i都是3
// alert(test1);
// alert(test2);
// 以上弹出的都是3。
//这里的陷阱就是:函数带()才是执行函数! 单纯的一句 var f = function() { alert('Hi'); }; 是不会弹窗的,后面接一句 f(); 才会执行函数内部的代码。上面代码翻译一下就是:
//情况2
function f(){
var a=[];
var i;
for(i=0;i<3;i++){
a[i]=(function(x){
return function(){
return x;
}
})(i); //注意自调用写法。
}
return a;
}
var test=f();
//调用后他的内部FOR循环函数内部已经自调用了,因此
//a[i]=function(i){return i};
alert(test0);
alert(test1);
alert(test2);
//情况3
// function f(){
// function test(x){
// return function(){
// return x;
// }
// }
// var a=[];
// var i;
// for(i=0;i<3;i++){
// a[i]=test(i);
// }
// return a;
// }
// var res=f();
// alert(res0);
// alert(res1);
// alert(res2);
</script>
</body>
<html>
4 注意自调用函数的形式, 立即执行的函数
例如: (function test(){要执行的代码段})();
网友评论