Почему функция setitimeout является значением доступа i даже после завершения вызова функции - PullRequest
0 голосов
/ 06 мая 2020

function printSeries() {
	for (var i = 0; i < 10; i++) {
		setTimeout(function () {
			console.log(i);
		}, 3000);
	}
	console.log('printing');
}

printSeries();

Почему он печатает значение as i 10 раз? Функция обратного вызова SetTimeout вызывается после того, как стек пуст. Хранит ли внутри лексическую область видимости

1 Ответ

2 голосов
/ 06 мая 2020

Когда скрипт впервые достигает 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 привязано к функции, а не только к ссылке.

...