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!
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. –
Beachten Sie auch, dass in ES2015 über 'let' und' const' Deklarationen JavaScript * keinen Blockbereich hat. – Pointy
* Während ich vollständig verstehe, dass JavaScript nur Funktionsumfang hat und nicht den Umfang blockieren * Sie völlig falsch verstehen. –