2013-10-10 53 views
4

我的JS代碼: -的Javascript關閉疑慮點擊事件

var ul = document.createElement("ul"); 
    for(var i=0; i<10; i++){ 
    var li= document.createElement("li"); 
    li.innerHTML='this is my li '+ i+ '.'; 
    li.onclick = (function(){ 
     return (function(){ 
      alert(i); 
     }) 
    })(); 
    ul.appendChild(li); 
    } 

    document.body.appendChild(ul); 

測試代碼 - http://jsfiddle.net/VhfEh/112/

HTML視圖: -

this is my li 0. 
this is my li 1. 
this is my li 2. 
this is my li 3. 
this is my li 4. 
this is my li 5. 
this is my li 6. 
this is my li 7. 
this is my li 8. 
this is my li 9. 

當我點擊任何li的我得到10 ..這是最大值i或它是i++值..

我嘗試了一些東西,但它不工作?

疑惑: -

  • 功能與功能不關閉在JavaScript?

  • 我正在使用的示例是JavaScript Closure示例?

謝謝!!

回答

4

你真的很接近;你忘記了設置和使用參數與匿名函數:

li.onclick = (function (i) { 
    return (function(){ 
     alert(i); 
    }) 
})(i); 

的立即執行的函數的整點是給每個處理器循環變量的專用副本,所以你必須真正傳遞它作爲一個參數。

+0

感謝這個代碼工作:) –

+0

例子中,我使用的是JavaScript的閉包的例子? –

+0

我的一位同事告訴我在函數定義中的函數不是JavaScript中的閉包?你能否讓我明確這個概念..? –

2

你是對的需要關閉。

你必須保持i的地方,是由函數體中創建的閉包:

li.onclick = (function(){ 
    var localI = i; 
    return (function(){ 
     alert(localI); 
    }) 
})(); 
+0

感謝此代碼正在工作。 +1 –