この問題に対処するには2つの方法があります。
最初に知っておくべきことは、スコープは関数レベルでのみ発生し、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"]();
もう1つの方法は、ループ内ですぐに実行される無名関数を作成することです。
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"]();
すべてが閉鎖に関連する問題です。詳細については、ウィキペディアを参照してください。