2017-05-04 13 views
-1

Ich bin dabei, JavaScript zu lernen. Während ich vollständig verstehe, dass JavaScript nur Funktionsumfang hat und den Umfang nicht blockiert, bin ich über ein Beispiel einer for-Schleife gestolpert, in der Funktionen vollständig erstellt werden und ich völlig ignoriere, warum das folgende Beispiel nicht so funktioniert, wie man es erwarten würde.Javascript-Verschluss innen für Schleifen

var funcs = []; 
 
for (var i = 0; i < 3; i++) {  // let's create 3 functions 
 
    funcs[i] = function() {   // and store them in funcs 
 
    console.log("My value: " + i); // each should log its value. 
 
    }; 
 
} 
 
for (var j = 0; j < 3; j++) { 
 
    funcs[j]();      // and now let's run each one to see 
 
}

Es gibt dieses:

Mein Wert: 3
Mein Wert: 3
Mein Wert: 3

Und nicht:

Mein Wert: 0
Mein Wert: 1
Mein Wert: so etwas wie diese 2

Jetzt weiß ich, dass die Lösung wäre wäre, eine Funktion zu erstellen, die eine Funktion der Rückkehr gibt die Ich werte, was eine Schließung für diese Funktion schaffen würde.

Allerdings ist meine Frage eher, und ich habe ein paar Erklärungen gesehen, die ich nicht ganz verstehe, warum das Beispiel überhaupt nicht funktioniert und was eigentlich passiert?

Ich bin nicht sicher, wie die Array func mit drei Tasten gefüllt ist:

func [0], func [1] und func [2], während die Funktionsdeklaration wird immer 3 zurückkehren? Warum sollte func [0] überhaupt existieren und nicht nur func [3]? Es scheint mir, dass dort in der for-Schleife ein gewisser Umfang angelegt wird, aber nur für die Zuweisung eines Schlüssels, aber nicht für die Zuweisung, die ich ungerade finde.

Konnte jemand mich erleuchten? Wie würde eine Schritt-für-Schritt-Bewertung der for-Schleife aussehen und warum?

Vielen Dank für Ihre Hilfe schon!

+0

Der Wert von "i" in der Funktion bezieht sich auf den Wert von "i" außerhalb, der sich ständig ändert. Wenn Sie schließlich alle 'func [x]' haben, ist der Wert von 'i' 3 (was die 'for'-Schleife bei 'i <3' unterbrach), die Ihnen gezeigt wird. –

+2

Beachten Sie auch, dass in ES2015 über 'let' und' const' Deklarationen JavaScript * keinen Blockbereich hat. – Pointy

+0

* Während ich vollständig verstehe, dass JavaScript nur Funktionsumfang hat und nicht den Umfang blockieren * Sie völlig falsch verstehen. –

Antwort

-1

func [0], func [1] und func [2] während die Funktionsdeklaration immer 2 zurückgibt?

Nr func[i] gibt immer 3, weil i3 ist, wenn die Funktion ausgeführt wird.

Es scheint mir, dass irgendeine Art von Umfang es in der for-Schleife

erstellt

Es nicht (gut ist, ist da, aber let ist im Spiel nicht so ist es nicht für alles verwendet). Der Umfang wird durch die umschließende Funktion definiert. i existiert in das scope und wird von der for-Schleife geändert.


Wie wäre ein Schritt für Schritt Bewertung der for-Schleife aussehen wie und warum?

var funcs = []; 

Erstellen Sie ein Array

for (var i = 0; i < 3; i++) {  // let's create 3 functions 

Sets i 0 bis 1, 2, 3.

funcs[i] = function() {   // and store them in funcs 
    console.log("My value: " + i); // each should log its value. 
    }; 

eine Funktion um jeden i dem Array Ordnet ist derzeit

} 

Schleifenende

for (var j = 0; j < 3; j++) { 

Sets j 0, 1, 2, 3.

i noch 3.

funcs[j]();      // and now let's run each one to see 

die erste Funktion aufruft. i ist 3. Ruft die zweite Funktion auf. i ist 3. Ruft die dritte Funktion auf. i ist 3.

} 

Fin.

+0

Das ist auch irgendwie verwirrend, weil das bedeutet, dass JavaScript als Aufruf durch Verweis hier übergeben wird, oder? Ich dachte, JavaScript wurde in allen Fällen als Wert aufgerufen, aber Arrays und Objekte? – Sebastian

+0

@Sebastian - Es gibt keine Variable. Ihr Code übergibt überhaupt keine Argumente, wenn Sie eine Funktion aufrufen. – Quentin