JavaScript Лексическое окружение - PullRequest
0 голосов
/ 06 августа 2020

Я слышал, что каждая функция запоминает (?) Лексическое окружение, в котором была создана функция.

В этом коде, функция function () { console.log(i);}, я хочу знать, где эта функция была создана. Если какая-то функция является параметром другой функции, где находится созданная (?) / Сгенерированная точка?

function countSeconds(howMany) {
  for (var i =1; i <= howMany; i++) {
    setTimeout(function () {
      console.log(i);
    }, i * 1000 );
  }
};

Ответы [ 3 ]

1 голос
/ 16 августа 2020

В этом коде функция 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);
0 голосов
/ 16 августа 2020

Если какая-то функция является параметром другой функции, где находится созданная (?) / Сгенерированная точка?

Как и все аргументы вызова функции, они вычисляются прямо перед функция вызывается. Вы можете переписать это с двумя временными переменными в эквивалент

function countSeconds(howMany) {
  for (var i=1; i<=howMany; i++) {
    const __arg1 = function() {
      console.log(i);
    };
    const __arg2 = i * 1000;
    setTimeout(__arg1, __arg2);
  }
}

Функция создается при вычислении выражения функции.

(Также обратите внимание, что этот код имеет известное закрытие в al oop проблема .)

0 голосов
/ 06 августа 2020

Я не понимаю, что вы имеете в виду?

Вы имеете в виду, где определена функция console.log ()?

class console {
   log(text) {
     [I dont know]
   }
}

Тогда вы можете сделать "console.log ()" таким, чтобы вызвать функцию "Журнал" из консоли Claas? Вы это имели в виду?

...