Почему это закрытие работает? - PullRequest
8 голосов
/ 01 марта 2012

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

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();

Почему переменная «эй» видна только когда яположить его внутри анонимной функции?

Ответы [ 3 ]

14 голосов
/ 01 марта 2012

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

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

6 голосов
/ 01 марта 2012

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

3 голосов
/ 01 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...