網上有個問題到處都是,我是新手,自然也遇到了
問題如下:
請看下面的**:為什麼我無論點哪乙個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...