你有两种方法来处理这个问题。
要知道的第一件事是范围只发生在函数级别,而不是在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