Объясните, почему анонимные функции в Javascript могут обращаться к переменным во внешней функции? - PullRequest
2 голосов
/ 03 февраля 2012

Прежде чем я начну, я понимаю, что спецификация скрипта ECMA, вероятно, ответит на мой вопрос, но я задаю его на SO в надежде на приемлемый ответ.

Возьмите следующий код:

function test1(param) {
    alert(param);
}

function test2() {
    var testvar = 99;
    setTimeout(function(){ test1(testvar); }, 1000);
}

test2();

Если я запускаю этот код, я получаю всплывающее окно, отображающее 99. Мой вопрос в test2, не должен ли testvar быть нулевым после завершения test2?Как анонимная функция в setTimeout получает значение testvar?Есть ли какое-то копирование стека, происходящее правильно, когда вызывается setTimeout?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Это результат замыканий .Функции в JavaScript сохраняют ссылки на переменные, определенные в их лексической области видимости.То есть на все переменные, на которые можно ссылаться при создании функции, заданной для setTimeout, можно ссылаться задолго после того, как вернулось test2.

Таким образом, замыкание является одновременно функцией и наборомпривязки к переменным, которые находились в области видимости при создании функции.Вот почему замыкания иногда называют объектами бедняков наоборот ).

1 голос
/ 03 февраля 2012

Это происходит из-за Javascript Closures . По сути, переменные, доступные для функции во время ее определения, всегда будут доступны для нее, независимо от того, откуда она вызывается.

0 голосов
/ 03 февраля 2012

Функция называется замыкания . Вы в основном правы в том, что происходит, переменные из окружающей области видимости сохраняются, если они необходимы в анонимной функции.

...