В этом коде функция function () { console.log(i);}
, я хочу знать, где была создана эта функция.
Эта функция определена как выражение . Такое выражение вычисляется во время времени выполнения , так же, как выражение { y: x*x }
оценивается во время выполнения. Но в этом случае результатом оценки является функциональный объект. Затем эта функция передается в качестве аргумента в setTimeout
. Это означает, что создано столько же функций, сколько итераций вашего for
l oop.
Теперь, даже если выражение функции вычисляется в момент выполнения setTimeout
, это не означают, что тело функции выполняется одновременно. Это не. Он будет выполнен только по истечении тайм-аута. В это время выполняется тело функции, и только тогда оно будет оценивать выражения, используемые в этом коде, такие как переменная i
. В вашем примере переменная i
уже достигла значения howMany+1
, потому что эта for
l oop уже завершилась до истечения таймера и был вызван обратный вызов.
Если этого вы хотите избежать, тогда используйте отдельную переменную i
для каждой итерации for
l oop. Используя let
вместо var
, вы создаете такие отдельные переменные, которые живут только внутри блока for
l oop. И тогда каждое из функциональных выражений будет ссылаться на свое «собственное» i
:
function countSeconds(howMany) {
for (let i =1; i <= howMany; i++) {
setTimeout(function () {
console.log(i);
}, i * 1000 );
}
};
countSeconds(10);