看板 Ajax 關於我們 聯絡資訊
在網路上看到一個例子, 但一直覺得很困惑, function addLinks () { for (var i=0, link; i<5; i++) { link = document.createElement("a"); link.innerHTML = "Link " + i; link.onclick = function (num) { return function () { alert(num); }; }(i); document.body.appendChild(link); } } window.onload = addLinks; 為何onclick的觸發函式是宣告成: function(num) { return function() { alert(num); } } 但實際上觸發時,並不會代入任何參數, 而且num沒被宣告過,alert時應該是沒有東西? 為何不是寫成如下: function(i) { return function() { alert(i); } } 但實際測試的結果,兩者結果都是相同的, 會利用closure的特性,將當下的i暫存起來, 今晚想破頭就是為這題 冏rz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.173.227.21
Fantasywind:因為寫成i return 的fn會直接抓i的值 全部結果都會是 01/06 02:12
Fantasywind:alert(4) 01/06 02:12
Fantasywind:因為當你click的時候i會是4 num的作法是 當這個函式被 01/06 02:13
Fantasywind:onclick觸發的同時才會透過傳值建立 而傳進去的值在 01/06 02:14
Fantasywind:for-loop中透過存入onclick參考做暫存了 這裡的暫存因 01/06 02:15
Fantasywind:為不是使用參考 所以不會被i的改變所影響 01/06 02:15
Fantasywind:除了closure還有event-oriented的概念 01/06 02:16
Fantasywind:我昏了 integer是不會有參考問題 所以兩個寫法都可以 01/06 02:18
Fantasywind:但是這兩個寫法都太冗長 直接alert(i) 就好透過 01/06 02:18
Fantasywind:closure直接存起來 不需要傳值阿 01/06 02:19
grence:(function(num){..})(i)是宣告一個函數 接著立刻執行它 01/06 02:29
grence:num是 function的參數,i才是實際代入的值 01/06 02:30
Fantasywind:我覺得這樣比較清楚 http://jsfiddle.net/vanMv/ 01/06 02:31
Fantasywind:但其實意思是一樣的 01/06 02:32
sabiya:感謝兩位大大回應,真的是鬼遮眼,沒看到self invoke 01/06 03:04