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(){要執行的代碼段})();