Wie verhält sich das Hoisting von Variablen, die in JavaScript innerhalb von Schleifen deklariert werden?
Hallo! Ich bin Zulieferer in der Hebebranche und möchte heute in ein hochinteressantes Thema in JavaScript eintauchen: das Hebeverhalten von Variablen, die in Schleifen deklariert werden.
Lassen Sie uns zunächst kurz erläutern, was Heben ist. In JavaScript ist das Heben ein Mechanismus, bei dem Variablen- und Funktionsdeklarationen an den Anfang ihres enthaltenden Gültigkeitsbereichs verschoben werden, bevor der Code ausgeführt wird. Es ist, als ob die JavaScript-Engine alle Deklarationen aufnimmt und sie „hochhebt“. Sie können also eine Variable verwenden oder eine Funktion aufrufen, bevor sie tatsächlich im Code deklariert wird.
Wenn es nun um Variablen geht, die innerhalb von Schleifen deklariert werden, wird die Sache etwas komplizierter. Beginnen wir mit der alten SchuleunserStichwort.
Heben mitunserin Schleifen
Wenn Sie verwendenunserUm eine Variable innerhalb einer Schleife zu deklarieren, wird diese Variable an die Spitze der umschließenden Funktion oder des globalen Gültigkeitsbereichs gehoben. DerunserSchlüsselwort hat keinen Gültigkeitsbereich auf Blockebene; Es hat nur Funktionsebene oder globalen Geltungsbereich.
Schauen Sie sich dieses einfache Beispiel an:
for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }
In diesem Code erwarten wir etwas zu sehen0,1, Und2wird nach einer Sekunde ausgedruckt. Aber was tatsächlich passiert, ist Folgendes3wird dreimal gedruckt. Warum? Nun, wegen des Hebens. Derwar drinDie Deklaration wird an die Spitze des umschließenden Bereichs gehoben. Bis diesetTimeoutRückrufe werden ausgeführt, die Schleife ist bereits beendet und der Wert vonichIst3.
Die Rückrufe imsetTimeoutFunktionen schließen über dieselbe Variableich. Da die Schleife ihre Ausführung abgeschlossen hat, ist der Wert vonichhat seinen Endwert erreicht, nämlich3.
Um dieses Problem mit zu behebenunserkönnen wir einen sofort aufgerufenen Funktionsausdruck (IIFE) verwenden. So geht's:
for (var i = 0; i < 3; i++) { (function (j) { setTimeout(function () { console.log(j); }, 1000); })(i); }
In diesem Code erstellen wir mithilfe des IIFE einen neuen Bereich für jede Iteration der Schleife. Der aktuelle Wert vonichwird als Argument übergebenJzum IIFE und jeder Rückruf imsetTimeoutschließt jetzt über eine andere VariableJ. Wir erhalten also die erwartete Ausgabe von0,1, Und2.
Heben mitlassenUndconstin Schleifen
ES6 eingeführtlassenUndconst, die einen Gültigkeitsbereich auf Blockebene haben. Wenn Sie verwendenlassenoderconstUm eine Variable innerhalb einer Schleife zu deklarieren, erhält jede Iteration der Schleife eine eigene separate Instanz der Variablen.
Schreiben wir das vorherige Beispiel mit umlassen:
for (let i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }
Dieser Code wird korrekt gedruckt0,1, Und2nach einer Sekunde. DerlassenSchlüsselwort erstellt eine neue Bindung fürichin jeder Iteration der Schleife. Also jeder Rückruf imsetTimeoutwird über eine andere Instanz von geschlossenich.
Das Gleiche gilt fürconst. Wenn Sie verwendenconstInnerhalb einer Schleife erhält jede Iteration auch ihre eigene Instanz, aber Sie können den Wert von a nicht neu zuweisenconstVariable.
for (let i = 0; i < 3; i++) { const j = i * 2; setTimeout(function () { console.log(j); }, 1000); }
Dieser Code wird gedruckt0,2, Und4nach einer Sekunde, wie erwartet.
Praktische Anwendungen
Das Verständnis des Hebeverhaltens von Variablen in Schleifen ist entscheidend für das Schreiben von korrektem JavaScript-Code, insbesondere beim Umgang mit asynchronen Vorgängen wiesetTimeoutoder AJAX-Aufrufe.
In einem realen Szenario könnten Sie beispielsweise eine Webanwendung erstellen, die für jedes Element in einer Liste Daten von einer API abruft. Sie möchten sicherstellen, dass jeder asynchrone Aufruf den richtigen Wert für das Element hat, mit dem er arbeitet.
Angenommen, Sie verwenden eine Schleife, um eine Liste von Produkt-IDs zu durchlaufen und für jedes Produkt einen API-Aufruf durchzuführen. Wenn Sie das Heben von Variablen nicht richtig handhaben, kann es sein, dass alle API-Aufrufe dieselbe Produkt-ID verwenden.
const productIds = [1, 2, 3]; for (let i = 0; i < productIds.length; i++) { const productId = productIds[i]; fetch(`https://api.example.com/products/${productId}`) .then(response => Response.json()) .then(data => console.log(data)); }
In diesem Code wird verwendetlassenstellt sicher, dass jeder API-Aufruf die richtige hatProdukt-ID.
Bezogen auf das Heben in unserem Unternehmen
Als Hebezeuglieferant beschäftigen wir uns mit unterschiedlichen Arten von Geräten und Mechanismen. Genauso wie JavaScript unterschiedliche Regeln für das Heben von Variablen hatunser,lassen, Undconst, wir haben unterschiedliche Regeln und Best Practices für das Heben in derMetallherstellungIndustrie.
Wenn es um das Heben schwerer Metallkonstruktionen gehtVorgefertigte 3D-Zeichnung für ein Hochhaus aus Baustahl, müssen wir sehr sorgfältig auf die Lastverteilung, den Hebewinkel und die Stabilität der Struktur achten. Jeder Hebevorgang ist wie eine separate Iteration in einer Schleife. Wir müssen sicherstellen, dass alle Parameter für jeden Vorgang richtig eingestellt sind.
Ebenso zVorgefertigtes Hochhaus-Wohngebäude aus StahlDer Hebevorgang ist komplex und erfordert ein tiefes Verständnis des Designs der Struktur und der Fähigkeiten unserer Hebeausrüstung.


Abschluss
Zusammenfassend lässt sich sagen, dass das Hebeverhalten von Variablen, die in JavaScript-Schleifen deklariert werden, vom verwendeten Schlüsselwort abhängt.unserhat Funktionsebene oder globalen Gültigkeitsbereich, was bei Verwendung in Schleifen mit asynchronen Vorgängen zu unerwarteten Ergebnissen führen kann. Auf der anderen Seite,lassenUndconsthaben einen Gültigkeitsbereich auf Blockebene und erstellen in jeder Iteration der Schleife eine neue Instanz der Variablen.
Wenn Sie in der Branche Hochhausstahlkonstruktionen oder in einer anderen Branche tätig sind, in der Hebevorgänge erforderlich sind, ist es wie bei JavaScript von entscheidender Bedeutung, die Details richtig zu machen. Ob es um den richtigen Variablenumfang im Code oder die richtige Hebetechnik für Ihre Ausrüstung geht, kleine Fehler können zu großen Problemen führen.
Wenn Sie an unseren Hebedienstleistungen oder -produkten interessiert sind, zögern Sie nicht, sich an uns zu wendenKontaktieren Sie uns, um Ihre Beschaffungsbedürfnisse zu besprechen. Wir sind hier, um Ihnen bei all Ihren Hebeanforderungen zu helfen, genauso wie wir versucht haben, für Sie etwas Licht in das Hebeverhalten in JavaScript zu bringen.
Referenzen
- „JavaScript: The Definitive Guide“ von David Flanagan
- JavaScript-Dokumentation des Mozilla Developer Network (MDN).
