SLaks ответ хороший, но он не смог объяснить , почему это не сработало.
Проблема связана с областью видимости. Попробуйте это:
var logger = function(x){
console.log(x);
};
for(var j = 0; j < 10; j++){
window.setTimeout(function(){
logger(j);
}, 1000);
}
Эта милая маленькая функция выводит только ... 9s! Это связано с тем, что ссылка на j сохраняется в течение времени ожидания, поэтому к моменту времени ожидания j уже установлено в 9.
Сравните это с:
var logger = function(x){
console.log(x);
};
for(var j = 0; j < 10; j++){
// we're wrapping our call in an anonymous function
// don't do this in production code...make the function external instead
// so you don't create 10 functions
(function(k){
window.setTimeout(function(){
logger(k);
}, 1000);
})(j);
}
Эта версия оборачивает внутренний вызов в анонимную функцию, которая принимает в качестве аргумента индекса. Поскольку область действия k теперь ограничена этой функцией, регистратор работает так, как вы ожидаете.