2012-03-01 3 views
8

Скажем, у меня есть простая функция, которая предупреждает сообщение:Почему это закрытие работает?

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

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

+1

я бы тоже попробуй это; 'setTimeout (" var hey = 'hi there'; callMessage (hey) ", 1000);' – mindandmedia

+0

Если бы я был вами, я бы прочитал что-то вроде: http://www.digital-web.com/articles/scope_in_javascript/ –

ответ

14

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

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

+0

Во втором примере тело закрытия не оценивается до тех пор. – sepp2k

+2

Это не * выполнено * до более позднего времени. Первый из них * буквально * оценен ('eval()') без намека на то, какая область должна использоваться, потому что это «просто строка». –

+0

Это имеет смысл. Я не знал, что анонимные функции имеют копию его родительской области – levi

6

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

3

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

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

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

Смежные вопросы