2016-04-01 16 views
-2

Ich bin ein JS-Neuling und habe über Verschlusssachen gelesen, die häufigen Probleme aufgrund von Missverständnissen, wie Schließungen funktionieren und die "Einstellungshandler in einer Schleife" waren ein ziemlich gutes Beispiel. Ich habe auch die Wege gesehen und verstanden, um dies zu umgehen, d. H. Durch Aufrufen einer anderen Funktion, die die Schleifenvariablen als Argumente übergibt und eine Funktion zurückgibt. Dann habe ich versucht, einen Zwischenfall zu machen, um zu sehen, ob es andere Möglichkeiten gibt, um dies zu umgehen, und ich habe den folgenden Code erstellt.Verschlüsse innerhalb von Schleifen und lokalen Variablen

Es funktioniert nicht, was ich vermutete, aber ich verstehe nicht warum. Ich verstehe, i wurde erfasst und für alle erzeugten Funktionsausdrücke zur Verfügung gestellt. Aber warum funktioniert das immer noch nicht, nachdem die erfasste Variable der lokalen Variablen index zugewiesen wurde? Weist i das selbe wie i als Argument einer anderen Funktion nicht zu? Ich meine, ist nicht i ein primitives und soll es nicht kopiert werden?

Ich bin verwirrt und ich würde es wirklich schätzen, wenn mir jemand sagen könnte, was hier vor sich geht.

+0

Wert von 'index' wird' I' Sie jedes Mal, klicken Sie darauf und Wert von 'I' ist' 9 'als' click'-Handler wird nur aufgerufen, nachdem 'loop' beendet ist..Versuchen Sie dies: https://jsfiddle.net/rayon_1990/sgtgfk8s/ – Rayon

Antwort

1

Ich denke, Sie erwarten, dass var index = i; in jeder Iteration der Schleife ausgeführt wird, indem Sie verschiedene Werte für verschiedene index Variablen festlegen, was nicht passiert. Während jeder Iteration wird nur die Funktion dem Handler zugewiesen, die Funktion wird nicht ausgeführt.

Dieser Satz wird nur ausgeführt, wenn Sie klicken. Zu diesem Zeitpunkt ist der Wert i bereits der höchste Wert Ihrer Schleife. Dieses genaue Problem wird durch die Lösungen gelöst, die Sie lesen.

, was während der Schleife passiert:

inpArr[0].onclick = <a function>; //(local)index=undefined; i=0; 
inpArr[1].onclick = <a function>; //(local)index=undefined; i=1; 
inpArr[2].onclick = <a function>; //(local)index=undefined; i=2; 
inpArr[3].onclick = <a function>; //(local)index=undefined; i=3; 
. 
. 
inpArr[9].onclick = <a function>; //(local)index=undefined; i=9; 

und wenn Sie

klicken
index = i; //i=9; (local)index=9; 
+0

Ah. Schnappen! Hätte mehr darüber nachdenken sollen. Ja, ich habe es verwirrt mit der Ausführung der Erklärung jedes einzelne Mal. Vielen Dank. –

Verwandte Themen