js閉包簡述 不要太去強調閉包,不然你會暈的

2021-09-28 23:51:01 字數 1262 閱讀 5111

看了幾年的閉包了。但是深挖,就一群呵呵呵了。

不信?先拿別人的試題來考一下,看看這題:

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 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式...