我想在for循環中爲li添加事件。JavaScript:在循環中添加事件 - 混淆問題
我知道總是出錯:關閉可以訪問的i
是最後一個值i
。需要將i
鎖定在關閉位置。
要解決這個問題,請立即調用函數表達式。
我不明白的是爲什麼這不起作用!
for (var i = 0; i < 10; i++){
var li = document.createElement('li');
ul.appendChild(li);
li.onclick = (function(i2){
return slideTo(i2); // slideTo is a global function
}(i));
但我知道這將工作:
li.onclick = (function(i2){
return function(){
slideTo(i2); // slideTo is a global function
}
}(i));
爲什麼我需要把slideTo(i)
成一個匿名函數???
這兩個表達式有什麼區別?
非常感謝!
感謝您的幫助!所以如果我沒有錯,第一個場景會立即調用slideTo(is2)並返回一個值。而第二個函數將返回一個函數:function(){slideTo(i2)}作爲一個整體,現在不會被調用。我對嗎? – flyaway
@flyaway - 是的。在第二個例子中,評估整個表達式'(function(i2){return function(){slideTo(i2);}}(i))'。外部函數被立即調用,所以你得到的是'li.onclick = function(){slideTo(i2)}'但具有不同的作用域(感謝外部函數。 – kamituel