Почему это закрытие работает?

Скажем, у меня есть простая функция, которая предупреждает о сообщении:

function callMessage(msg){
 alert(msg);
 }

Теперь, когда я называю это так, он не работает. Выдает ошибку "эй не определен"

function sayHi(){
 var hey = "hi there"
 setTimeout("callMessage(hey)", 1000);
 }
 sayHi();

Но когда я вызываю его внутри анонимной функции, он работает:

function sayHi(){
 var hey = "hi there"
 setTimeout(function(){callMessage(hey);}, 1000);
 }
 sayHi();

Почему переменная "hey" видна только тогда, когда я помещаю ее в анонимную функцию?

3 ответа

В первом примере код оценивается после истечения таймера и текущей области. hey в данный момент undefined.

Второй пример - правильный способ использования setTimeout - использует анонимную функцию, созданную при вызове setTimeout(). Эта анонимная функция также получает копию текущей области.


"callMessage (hey)" является строкой, а не закрытием. Он оценивался, когда истекает время ожидания, и в этот момент переменная hey не входит в область действия.


Это нормально.

Второй пример создает то, что мы называем приспособлением, это контекст выполнения. переменная hey variable сохраняется для использования анонимной функцией в памяти.

В первом примере переменная hey не сохраняется в приборе (поскольку javascript не может знать, что вы будете использовать переменную после) и поэтому не может быть извлечен, когда оценивается строка

licensed under cc by-sa 3.0 with attribution.