Heim > Web-Frontend > js-Tutorial > Wie vermeide ich Abschlussprobleme beim Erstellen von Funktionen innerhalb von Schleifen in JavaScript?

Wie vermeide ich Abschlussprobleme beim Erstellen von Funktionen innerhalb von Schleifen in JavaScript?

Barbara Streisand
Freigeben: 2024-10-16 17:46:02
Original
203 Leute haben es durchsucht

How to Avoid Closure Issues When Creating Functions Within Loops in JavaScript?

JavaScript-Schließung innerhalb von Schleifen – ein praktisches Beispiel

Beim Erstellen von Funktionen innerhalb von Schleifen in JavaScript ist es wichtig, sich der Möglichkeit einer Schließung bewusst zu sein Probleme, bei denen die in diesen Funktionen verwendeten Variablen fälschlicherweise an denselben Wert gebunden sein können. Dies kann zu unerwartetem Verhalten führen, insbesondere wenn es zu Verzögerungen kommt.

Problembeschreibung

Beachten Sie den folgenden Code:

<code class="js">const funcs = [];
for (var i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>
Nach dem Login kopieren

Die beabsichtigte Ausgabe lautet:

<code>My value: 0
My value: 1
My value: 2</code>
Nach dem Login kopieren

Dieser Code gibt jedoch tatsächlich Folgendes aus:

<code>My value: 3
My value: 3
My value: 3</code>
Nach dem Login kopieren

Dieses Problem tritt auf, weil die Variable i innerhalb der anonymen Funktionen an dieselbe Variable außerhalb der Schleife gebunden ist . Daher verwendet jede Funktion bei der Ausführung den Endwert von i.

ES6-Lösung: let

In ECMAScript 6 (ES6) , das Schlüsselwort let ermöglicht blockbezogene Variablen. Durch die Verwendung von let innerhalb von Schleifen wird bei jeder Iteration eine neue Variable erstellt, wodurch das Abschlussproblem gelöst wird.

<code class="js">for (let i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value: " + i);
  };
}</code>
Nach dem Login kopieren

ES5.1-Lösung: forEach

Für Situationen Wenn Sie hauptsächlich über ein Array iterieren, kann die Funktion Array.prototype.forEach eine saubere Lösung bieten.

<code class="js">someArray.forEach(function(arrayElement) {
  // ... code for this one element
});</code>
Nach dem Login kopieren

Jeder Aufruf der Rückruffunktion stellt einen eigenen Abschluss dar, wodurch sichergestellt wird, dass der übergebene Parameter spezifisch ist zu dieser Iteration.

Klassische Lösung: Abschlüsse

Eine andere Methode zur Vermeidung von Abschlussproblemen ist die Verwendung klassischer Abschlüsse, bei denen die Variable innerhalb jeder Funktion an eine separate, unveränderlicher Wert.

<code class="js">function createfunc(i) {
  return function() {
    console.log("My value: " + i);
  };
}</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie vermeide ich Abschlussprobleme beim Erstellen von Funktionen innerhalb von Schleifen in JavaScript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
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