Heim > Web-Frontend > js-Tutorial > Warum gibt meine JavaScript-Schleife beim Anhängen von Ereignishandlern immer den Endwert der Zählervariablen aus?

Warum gibt meine JavaScript-Schleife beim Anhängen von Ereignishandlern immer den Endwert der Zählervariablen aus?

Linda Hamilton
Freigeben: 2024-12-28 05:40:15
Original
847 Leute haben es durchsucht

Why Does My JavaScript Loop Always Output the Final Value of the Counter Variable When Attaching Event Handlers?

Die berüchtigte Schleifenanomalie von JavaScript: erklärt

Das berüchtigte Problem der JavaScript-Schleife tritt auf, wenn versucht wird, Ereignishandler mithilfe einer Schleife an dynamisch generierte Elemente anzuhängen. Im folgenden Snippet:

function addLinks() {
  for (var i = 0, link; i < 5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;
    link.onclick = function () {
      alert(i); // WRONG: i will always be 5
    };
    document.body.appendChild(link);
  }
}
Nach dem Login kopieren

Wenn auf einen der generierten Links geklickt wird, zeigt die Warnung immer „Link 5“ an. Dies liegt daran, dass die mit var definierten JavaScript-Variablen funktionsbezogen und nicht blockbezogen sind. Wenn die Schleife endet, enthält i den Wert 5 und alle inneren Funktionen verweisen darauf, was zur einheitlichen Ausgabe führt.

Die korrigierte Lösung besteht darin, den Wert von i innerhalb eines Abschlusses zu erfassen. Betrachten Sie diesen Ausschnitt:

function addLinks() {
  for (var i = 0, link; i < 5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;
    link.onclick = function (num) { // Closure around i
      return function () {
        alert(num); // num retains its original value
      };
    }(i); // Execute the outer function immediately to capture i
    document.body.appendChild(link);
  }
}
Nach dem Login kopieren

In diesem Fall ist num für jede Iteration an den aktuellen Wert von i gebunden. Wenn die innere Funktion ausgeführt wird, wird num zum Zeitpunkt der Schleifenausführung konsistent auf den Wert von i gesetzt.

Darüber hinaus gibt es eine effiziente Alternative, die den DOM-Knoten zum Speichern von Daten nutzt:

function linkListener() {
  alert(this.i);
}

function addLinks() {
  for (var i = 0; i < 5; ++i) {
    var link = document.createElement('a');
    link.appendChild(document.createTextNode('Link ' + i));
    link.i = i;
    link.onclick = linkListener;
    document.body.appendChild(link);
  }
}
Nach dem Login kopieren

Durch das Anhängen von Informationen an das DOM-Element selbst wird der Bedarf an zusätzlichen Funktionsobjekten umgangen und die Effizienz verbessert.

Das obige ist der detaillierte Inhalt vonWarum gibt meine JavaScript-Schleife beim Anhängen von Ereignishandlern immer den Endwert der Zählervariablen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage