ECMAscript использует технику lexical closures
, которая является не чем иным, как внутренним хранилищем всех родительских объектов контекста / записей лексической среды (ES3 / ES5).
Одним словом, ваша анонимная функция используется setTimeout
закрывается над этой переменной i
, поэтому, пока этот тайм-аут "ждет", ваш цикл продолжается.setTimeout
работает, конечно, асинхронно, и это, в свою очередь, означает, что в то время, когда цикл завершил работу, значение, если i
, конечно, равно 2.
Теперь вспомните о закрытии, нашей анонимной функции в setTimeout
все еще содержит ссылку на i
, когда он, наконец, срабатывает (после 1000 мс).Таким образом, он правильно показывает вам значение 2.
Если вы хотите показывать числа для каждой итерации после 1000 мс, вам нужно вызвать другой контекст.Это может выглядеть как
setTimeout((function( local ) {
return function() {
console.log( local );
};
}( i )), 1000);