你有兩種方法來處理這個問題。
要知道的第一件事是範圍只發生在函數級別,而不是在JavaScript的循環內。 如果您在外部來源的函數中設置了一個變量,並且不立即執行該變量,該變量將在您的循環過程中進行更改。
您可以通過關閉其它變量解決這個問題:
var names = ["john","paul","george","ringo"];
var store = {};
//this function receives the data as a parameter
//so it will be a safe copy.
function createFunc(name){
//just return a function that will alert the name.
return function(){
alert(name);
}
}
for (var i in names) {
var hoverIn = createFunc(names[i]);
store[names[i]]=hoverIn;
}
store["john"]();
另一種方法是創建執行馬上 在循環中的匿名函數:
var names = ["john","paul","george","ringo"];
var store = {};
for (var i in names) {
//the function receives the i as a parameter
//and executes, so n is a safe copy of i
(function(n){
var hoverIn = function(){
alert(names[n]);
}
store[names[n]]=hoverIn;
})(i);
}
store["john"]();
一切都是個問題與關閉有關。 查看維基百科獲取更多信息。
來源
2012-08-17 10:03:29
shi
你不應該把var傳遞給函數!你爲什麼要創建一個名字的副本? – Serjio 2012-08-17 09:47:19
檢查此http://jsfiddle.net/yHSpg/並說我在我的答案錯誤在哪裏? – Serjio 2012-08-17 09:50:18
作爲一個方面說明,也可以包裝整個'for'循環體。 – pimvdb 2012-08-17 09:51:00