2011-08-30 53 views
-1
for(var i=0,len=btns.length;i<len;i++){ 
    (function(){ 
    btns[i].addEventListener('click',function(e){ 
     console.log(i) 
     },false) 
    })(i)}} 

大家好,我最近在學習Javascript。在上面的代碼中瞭解一點關閉,你知道,只需設置3個按鈕來記錄3個不同的i微小的javascript關閉問題

不幸的是,它失敗了。我知道我沒有得到關閉的點。爲什麼?我立即執行的功能,以便在聽者的回調函數i不會共享相同的i

希望有人能幫助〜

+0

這將Ë更容易爲我們幫助如果你發佈了一個鏈接到jsFiddle來展示你的問題 – Grezzo

+0

@ Grezzo,感謝您的建議,下次我會這樣做 – Lanston

回答

4

您傳遞i變量的函數,但該函數忽略參數,只是綁定到i裏面的函數是與外部相同的變量(因爲你指定了一個空的形式參數列表)。

因此,在您有機會推動任何按鈕之前,您的循環已完成並將所有閉合之間共享的單個i增加到3

重寫function()function(i)它會有更好的工作機會。

+1

哦,我看到了,我準備立即自殺,這樣一個愚蠢的帖子,下一次我在發佈我的問題之前,我會仔細地仔細掃描它,謝謝@Henning Makholm – Lanston

1

試試這個,你實際上聲明參數的功能,使i獲取函數內的本地定義:

for(var i = 0, len = btns.length; i < len; i++) { 
    (function(i){ 
     btns[i].addEventListener('click',function(e){ 
      console.log(i); 
     },false); 
    })(i); 
} 

當你有了它,你路過i作爲參數的功能,但實際上並未將其定義爲參數,因此傳遞的參數並未被使用。這就是爲什麼使用相同名稱是個壞主意的原因之一,因爲這些類型的錯誤不會導致javascript錯誤。我會與內部變量不同的名稱更喜歡這個所以有兩個之間沒有混亂的機會:

for(var i = 0, len = btns.length; i < len; i++) { 
    (function(loopVar){ 
     btns[loopVar].addEventListener('click',function(e){ 
      console.log(loopVar); 
     },false); 
    })(i); 
} 

你可以看到這項工作在這裏:http://jsfiddle.net/jfriend00/Hb5t3/

+0

您的意思是btns [i]或btns [loopVar]在您的最後一個示例中? –

+0

@cf_PhillipSenn - 是的,我糾正了它。謝謝。 – jfriend00