原創 JS閉包的簡單見解,新手向

2022-06-04 07:21:10 字數 1793 閱讀 7978

網上有個問題到處都是,我是新手,自然也遇到了

問題如下:

請看下面的**:為什麼我無論點哪乙個li標籤,都會出出來:點選了第5個標籤?

……

網上很多都是複製貼上,有經驗的js程式設計師一看就懂,可苦了我這種新手。現在我寫一點自己的理解也不知道對不對,如果有會的看到了,麻煩指正。

網上的答案大多是:

1.請看js閉包

2.事實上迴圈沒有為每個li繫結不同的方法

3.每個li繫結的方法都是一樣的 function沒被觸發,觸發時候裡面的 i 是5

還讓不讓新手活了?

我自己看了一下,寫一點見解。

reference:

來看這段**:

function a()

return b;

}var c = a();

c();

這是個閉包的典型例子。用了別人的總結:

1,閉包外層是個函式.

2,閉包內部都有函式.

3,閉包會return內部函式.

4,閉包返回的函式內部不能有return.(因為這樣就真的結束了)

5,執行閉包後,閉包內部變數會存在,而閉包內部函式的內部變數不會存在.

外層函式:a()

內層函式:b()

我估計閉包範圍就是從var i到return b 誰特麼來幫我鑑定一下?

這裡我們順序執行:

前面函式a()那個是定義,不管。

第一句:var c=a();

執行了一次a(),i=0;學過c語言的知道a裡的i,本應該被銷毀的

但是函式a() return了b

那麼c=b了,至此,「var c=a();」 執行完畢。

當函式a的內部函式b被函式a外的乙個變數(這裡就是例子裡的c)引用的時候,就建立了乙個我們通常所謂的「閉包」。

到這裡可以了,閉包產生了,他的後果就是外函式內,內函式外的變數i變成全域性變數了,哪怕a();早早執行完了

第二句:c();

前面說過 c被賦予了b的值,那麼c();就是b();

所以alert(i)的結果是1 我估計如果再來乙個c();結果應該是2

到這裡可能很多人跟當時的我一樣 看懂了這個經典的例子,但是一開始那個例子,為什麼每次還是5,很多人還是不懂

我這裡做個對應關係:

一開始的window.onload=function){} 對應例子2中的a()

for迴圈裡的

lis[i].onclick = function()

對應的就是函式b(),

有人說,例子2中函式b被返回了 例子1沒return啊?怎麼回事?

其實例子1中的function 賦給了onclick這就是return了

而且onclick是函式a()外的乙個變數,閉包達成!不信再看下定義

當函式a【例子1中是window.onload】的內部函式b【例子1中是function(alert)】被函式a外的乙個變數c【lis[i].onclick】引用的時候,就建立了乙個我們通常所謂的「閉包」。
這下明白了吧?

例子1 例子2的全域性變數都是那個i 不因為外函式執行完而銷毀失效

所以,那個i一直是5 自然每次都是5了

解決方案:

解決方案是怎麼回事我有時間寫

如果哪位高手發現我寫錯了 麻煩站內信我 我及時刪帖

簡單描述js閉包概念

簡單的描述閉包 如果在函式func內部宣告函式inner,然後在函式外部呼叫inner,這個過程即產生了乙個閉包。實現函式 makeclosures,呼叫之後滿足如下條件 1 返回乙個函式陣列 result,長度與 arr 相同 2 執行 result 中第 i 個函式,即 result i 結果與...

JS閉包的最簡單例子使用

function foo function bar fn 1000 wait hello,closure 將乙個內部函式 名為 timer 傳遞給 settimeout timer 具有涵蓋 wait 作用域 的閉包,因此還保有對變數 message 的引用。wait 執行 1000 毫秒後,它的內...

理解js的閉包

閉包 將內部函式儲存到外部時,將會生成閉包。閉包會導致原有的作用域鏈不釋放,造成記憶體洩漏。先來看乙個閉包的例子 functiona returnb vartemp a temp temp 此時輸出結果是2 和3,函式b和a形成了閉包,函式b被儲存到外部。functiontest functionb...