看了幾年的閉包了。但是深挖,就一群呵呵呵了。
不信?先拿別人的試題來考一下,看看這題:
js中的閉包記憶體會洩露嗎?
js中的閉包記憶體如何釋放?
js中的閉包如果不用return,還能取出閉包內的變數嗎?
js中的閉包中的變數可以通過外部函式改變嗎?
js中的閉包中的變數可以銷毀嗎?
希望這個討論能找到答案:
此文僅作為筆記整理,沒什麼重要的新的內容。
(官方)解釋:
乙個擁有許多變數和繫結了這些變數的環境的表示式(通常是乙個函式),因而這些變數也是該表示式的一部分。我的解釋:
乙個函式裡定義的區域性變數/私有變數,不扔出去,外部就訪問不到,這就是個閉包。除非我return,這個閉包才可以被外部訪問。換個思路:
//我寫了幾篇部落格,我不告訴你,你是看不了。
var o = (function() , ];
//只有我告訴你怎麼看得到, 你才可能看到,
//比如這裡我告訴你你可以訪問第i篇的標題。
//這個閉包才可能被外部訪問。
return
}}());
//現在你想看?你可以選擇看第幾篇的標題,因為我只給了你這個介面
o.view(0); //輸出:blog1
這個就是js裡閉包的乙個寫法。
現在看最基礎的演示:
function a()
return b;
} var c = a();
c(); //輸出1
我覺得很好理解。僅限於理解js閉包。
乙個例子:
dom:
點我 script:
$(document).ready(function() ;
});
沒用, newdata is not defined。
如能理解閉包,這裡就很好理解了,newdata是被閉包在$(document).ready(function() {}) 裡的。
外部是訪問不到的。
要解決,方案有:
上面我問: 「js中的閉包如果不用return,還能取出閉包內的變數嗎?」
答案是能。 可以定義全域性變數,然後在閉包中將需要的值賦給這個全域性變數。也可以用引數傳遞值。
如果再讓我答一次「簡述js中的閉包」,我應該能拿滿分了吧?
說說js閉包
js閉包涉及到作用域,js的作用域有兩種,全域性變數和區域性變數,全家變數就是在函式外宣告的,區域性變數是在函式內宣告的,函式內部可以直接讀取全域性變數 但是函式外部自然無法讀取函式內的區域性變數 函式內部宣告變數的時候,要用var不然就是個全域性變數 有時候需要得到函式內的區域性變數 濫用閉包會可...
JS閉包理解
下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...
JS基礎 閉包
注 自由變數是既不是在本地宣告又不作為引數傳遞的一類變數。function a return b var b a b hello closure 定義乙個函式a a中定義了函式b a中返回b 執行a 把a的返回結果賦值給變數b 執行b 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式...