2017-03-01 3 views
2

//-CodeClosures - Compilation vs Interpretation Phase Javascript

Startet
var a = 10; 
function outer() { 
    function inner() { 
     console.log(a); 
     console.log(b); 
    }; 
    var b = 20; 
    return inner; 
} 
var innerFn = outer(); 
innerFn(); 

// Code ends

Meine Frage ist:

In Closures, die Funktion erinnert sich an den Umfang Informationen aus der Zeit der Funktionsobjekt wird erstellt (im obigen Fall in der Kompilierungsphase), aber zu diesem Zeitpunkt sind die Zuweisungen (für a und b) nicht wirklich passiert. Wie werden die Werte für die Variablen a und b beibehalten?

Bitte korrigieren Sie mich, wenn etwas in der obigen Aussage nicht stimmt.

+0

a) eine Schließung schließt sich über eine Variable * scope *, nicht über Werte b) Es gibt keine "Kompilierungsphase" – Bergi

Antwort

2

Wie Sie in Ihrem ersten Satz gesagt haben, erinnert sich der Verschluss an die Scope Information. Dazu gehören die Verweise auf die Variablen, die bereits deklariert wurden (oder gleichzeitig mit der Funktion deklariert werden). Es spielt keine Rolle, welche Werte diese Variablen haben - sie werden ausgewertet, wenn die Variablen tatsächlich verwendet werden, wenn die Schließung aufgerufen wird.

Sie werden feststellen, dass, wenn Sie a überschreiben, nachdem die Schließung im Aufruf outer() geschaffen zu haben, ist es Ihnen den neuen Wert von a geben, wenn innerFn() aufrufen. Verschlüsse machen nicht erinnern die Werte von der Zeit ihrer Erstellung.

+0

Vielen Dank. Es war sehr hilfreich. –

+0

@ShashankShekhar Froh, dass ich geholfen habe :-) Vielleicht möchten Sie [die Antwort akzeptieren] (http://stackoverflow.com/help/someone-answers). – Bergi

+0

Sorry, ich bin ein bisschen neu im Forum. Akzeptiert. –

1

Ich glaube, dass die Schließung in diesem Fall tatsächlich erstellt wird, wenn Sie inner zurückgeben, nicht, wenn Sie die Funktion inner definieren. Solange Sie keinen Verweis auf eine Funktion erstellen, hat der Schließmechanismus keine Bedeutung.