Когда скрипт впервые достигает setTimeout
, он добавляет вашу функцию в очередь для выполнения через 3 секунды, а затем немедленно продолжает l oop.
К тому времени, как истекут 3 секунды, l oop уже давно закончен (10 итераций простого l oop не требуют 3 секунды), поэтому вы можете увидеть сообщение 'printing'
так рано.
К этому времени i
равно 10
, поэтому 10
печатается 10 раз (потому что это количество раз, когда функция была добавлена в очередь. Javascript использует текущий значение i
, а не значение i
в то время, когда функция была впервые добавлена в очередь.
Вот измененная версия скрипта, которая использует значение i
в время добавления функции в очередь:
function printSeries() {
for (var i = 0; i < 10; i++) {
setTimeout((function(i) {
return function() {
console.log(i);
}
}(i)), 3000);
}
console.log('printing');
}
printSeries();
Здесь значение i
привязано к функции, а не только к ссылке.