2011-10-12 50 views
5

在這種demo,我得到不同的輸出,如果我使用(無包裝)或(的onLoad)。沒有包裹物(頭)VS的onLoad

我的問題是,在HTML文件,以獲得正確的警報:1,2,3,4需要在代碼中有什麼變化?使用Dojo的一個簡單的負載我所有警報始終得到4:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
    var slider = []; 

    for (i = 0; i < 4; i++) { 

     slider[i] = function() { 

      alert([i]); 

     }; 
     dojo.addOnLoad(slider[i]); 
    } 
    </script> 

回答

3

你可以使用一個closure

var slider = []; 

for (i = 1; i < 5; i++) { 

    slider[i] = (function (i) { 

     return function() { alert([i]); } 

    })(i); 
    dojo.addOnLoad(slider[i]); 
} 

這將節省i到另一個功能範圍節電狀態。沒有關閉,i被限定爲原始功能。

+0

完美的男人,謝謝 – anvd

0

i的值是4的循環,這是你的職責將會看到他們被調用時結束。像這樣的東西應該工作:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
var slider = []; 

for (i = 0; i < 4; i++) { 
    eval("slider[i] = function() { alert([" + i + "]);};"); 
    dojo.addOnLoad(slider[i]); 
} 
</script> 

編輯:好,你也可以嘗試這樣做,當函數被調用,而正在定義時,他們比計數。例如

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
var slider = []; 
var onLoadCounter = 0; 

var onLoadCallback = function() { 
    alert(onLoadCounter); 
    onLoadCounter++; 
}; 

for (i = 0; i < 4; i++) { 
    slider[i] = onLoadCallback; 
    dojo.addOnLoad(slider[i]); 
} 
</script> 
+0

這是獨特的選擇嗎?如果是這樣,我會得到一個很大的eval(有更多的代碼) – anvd

+2

不要使用'eval'。調試速度慢並且很難。 – Quentin