2012-03-01 17 views
8

Say mam prostą funkcję, która ostrzega wiadomość:Dlaczego to zamknięcie działa?

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

Teraz, kiedy nazywają to jak tak, to nie działa. Zgłasza błąd „hej nie jest zdefiniowana”

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

Ale kiedy ja to nazywam wewnątrz anonimowej funkcji to działa:

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

Dlaczego „hej” zmienna widoczna tylko wtedy, gdy I umieścić go wewnątrz anonimowa funkcja?

+1

Chciałbym również Spróbuj tego; 'setTimeout (" var hey = 'hi there'; callMessage (hej) ", 1000);' – mindandmedia

+0

Gdybym był tobą, przeczytałbym coś takiego - http://www.digital-web.com/articles/scope_in_javascript/ –

Odpowiedz

14

W pierwszym przykładzie kod jest oceniany po upływie licznika czasu wygasł i bieżący zakres został pozostawiony. hey jest w tym momencie niezdefiniowana.

Drugi przykład - właściwy sposób użycia setTimeout - wykorzystuje anonimową funkcję utworzoną podczas wywoływania setTimeout(). Ta anonimowa funkcja otrzymuje także kopię bieżącego zakresu.

+0

W drugim przykładzie ciało zamknięcia również nie jest oceniane do tego czasu. – sepp2k

+2

Nie jest * wykonywane * do później. Pierwszy to * dosłownie * oceniany ('eval()') bez podpowiedzi, który zakres ma być użyty, ponieważ jest to "tylko ciąg". –

+0

To ma sens. Nie wiedziałem, że funkcje anonimowe mają kopię zakresu nadrzędnego – levi

6

"callMessage (hej)" to ciąg znaków, a nie zamknięcie. Jest oceniany po przekroczeniu limitu czasu, a w tym momencie zmienna hej nie jest w zasięgu.

3

To normalne.

Drugi przykład tworzy to, co nazywamy urządzeniem, jest to kontekst wykonawczy. zmienna hej zmienna jest zapisywana do użycia przez anonimową funkcję w pamięci.

W pierwszym przykładzie, hej zmienna nie jest zapisany w uchwycie (ponieważ JavaScript nie może wiedzieć, że będzie stosować zmienną po), a zatem nie mogą być pobierane, gdy ciąg jest oceniany

Powiązane problemy