Warum funktioniert diese Schließung?

8

Angenommen, ich habe eine einfache Funktion, die eine Nachricht anzeigt:

%Vor%

Wenn ich es jetzt so nenne, funktioniert es nicht. Wirft Fehler "hey ist nicht definiert"

%Vor%

Aber wenn ich es in einer anonymen Funktion anrufe, funktioniert es:

%Vor%

Warum ist die Variable "hey" nur sichtbar, wenn ich sie in eine anonyme Funktion stelle?

    
levi 01.03.2012, 15:47
quelle

3 Antworten

14

Im ersten Beispiel wird der Code ausgewertet nachdem der Timer abgelaufen ist und der aktuelle Bereich verlassen wurde. hey ist zu diesem Zeitpunkt nicht definiert.

Das zweite Beispiel - die richtige Methode zur Verwendung von setTimeout - verwendet eine anonyme Funktion, die beim Aufruf von setTimeout() erstellt wird. Diese anonyme Funktion erhält auch eine Kopie des aktuellen Bereichs.

    
Linus Kleen 01.03.2012, 15:48
quelle
6

"callMessage (hey)" ist eine Zeichenkette, keine Schließung. Es wird ausgewertet, wenn das Timeout ausgeführt wird, und zu diesem Zeitpunkt ist die Variable hey nicht im Bereich.

    
Ben Clayton 01.03.2012 15:49
quelle
3

Es ist normal.

Das zweite Beispiel erstellt, was wir ein Fixture nennen, dies ist ein Ausführungskontext. hey Variable Variable wird gespeichert, um von der anonymen Funktion im Speicher verwendet zu werden.

In Ihrem ersten Beispiel wird die hey-Variable nicht in einem Fixture gespeichert (weil Javascript nicht wissen kann, dass Sie die Variable später verwenden werden) und daher nicht abgerufen werden kann, wenn der String ausgewertet wird

    
Jerome Cance 01.03.2012 15:49
quelle

Tags und Links