你有两种方法来处理这个问题。
首先要知道的是作用域只发生在函数级别,而不是在 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"]();
一切都是与关闭有关的问题。查看维基百科了解更多信息。