Развернув простой цикл, вы увидите, что происходит:
var i = 0;
window.setTimeout( function(){
//No local i so it must be outside
console.log(i);
}, 1000 );
i++;
window.setTimeout( function(){
//No local i so it must be outside
console.log(i);
}, 1000 );
i++;
window.setTimeout( function(){
//No local i so it must be outside
console.log(i);
}, 1000 );
Как видите, все функции ссылаются на один и тот же i
, поэтому все они будут регистрировать 2
после срабатывания таймеров,Ни у одного из них нет локального i
.
. Вы можете создать «локальный» i
, например:
(function(i){
|---------^ //i found here, no need to use the global i
| window.setTimeout( function(){
-------------------- //no local i here so it must be outside
console.log(i);
}, 1000 );
})(i) //pass the "global" i as argument, with the value it has right now