閉包

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。 一、變量...
    zock閱讀 1,085評論 2 6
  • ● 閉包基礎 ● 閉包作用 ● 閉包經典例子 ● 閉包應用 ● 閉包缺點 ● 參考資料 1、閉包基礎 作用域和作...
    lzyuan閱讀 961評論 0 0
  • 閉包: 官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該...
    小裁縫sun閱讀 634評論 0 5
  • 1:閉包:一個函數外加上該函數所創建時所建立的作用域。閉包的名字來源于閉包“關閉”一個函數中自由變量的訪問的權利。...
    冰激凌_db91閱讀 315評論 0 0
  • 早睡讓人快樂
    每天美天閱讀 188評論 1 0