Was ist der richtige Weg, um eine for-in
Schleife in JavaScript zu schreiben ? Der Browser beschwert sich nicht über einen der beiden hier gezeigten Ansätze. Erstens gibt es diesen Ansatz, bei dem die Iterationsvariable x
explizit deklariert wird:
for (var x in set) {
...
}
Und alternativ dieser Ansatz, der natürlicher liest, mir aber nicht richtig erscheint:
for (x in set) {
...
}
javascript
syntax
for-in-loop
Futlib
quelle
quelle
var
der der Iterator nicht deklariert wurdei
:Uncaught ReferenceError: i is not defined
. Also werde ich es von nun an verwenden: / webpack behandelt "globale" Variablen seltsam, für weitere InformationenAntworten:
Verwenden
var
Sie diese Option, um den Umfang der Variablen zu verringern. Andernfalls sucht die Variable bis zum nächsten Abschluss und sucht nach einervar
Anweisung. Wenn es a nicht finden kann,var
ist es global (wenn Sie sich in einem strengen Modus befinden,using strict
werfen globale Variablen einen Fehler auf). Dies kann zu Problemen wie den folgenden führen.Wenn Sie
var i
in die for-Schleife schreiben, wird die Warnung angezeigt2
.JavaScript Scoping und Hoisting
quelle
var
in denfor
Blicken Kopf wie es für Schleife in der lokalen ist, was es nicht ist. Daher bevorzuge ich den folgenden Stil von user422039.Die erste Version:
deklariert eine lokale Variable namens
x
. Die zweite Version:nicht.
Wenn
x
es sich bereits um eine lokale Variable handelt (dh Sie haben einevar x;
oder einevar x = ...;
frühere Variable in Ihrem aktuellen Bereich (dh die aktuelle Funktion)), sind diese gleichwertig. Wennx
es sich nicht bereits um eine lokale Variable handelt, wird bei Verwendung der zweiten implizit eine globale Variable deklariertx
. Betrachten Sie diesen Code:Sie könnte dies zu Alarm erwarten
hey
,there
,heli
,hey
,there
,copter
, aber da dasx
ist ein und dasselbe es alarmierthey
,there
,there
,hey
,there
,there
. Das willst du nicht! Verwenden Sievar x
in Ihrenfor
Schleifen.Um das Ganze abzurunden: Wenn sich die
for
Schleife im globalen Bereich befindet (dh nicht in einer Funktion), entspricht der lokale Bereich (der Bereichx
wird bei Verwendung deklariertvar x
) dem globalen Bereich (der Bereichx
wird implizit in deklariert) Wenn Siex
ohne var) verwenden, sind die beiden Versionen identisch.quelle
Sie sollten sich wirklich lokale Variablen mit erklären
var
, immer .Sie sollten auch keine "for ... in" -Schleifen verwenden, es sei denn, Sie sind sich absolut sicher, dass Sie dies tun möchten. Zum Durchlaufen realer Arrays (was ziemlich häufig vorkommt) sollten Sie immer eine Schleife mit einem numerischen Index verwenden:
Das Durchlaufen eines einfachen Arrays mit "for ... in" kann unerwartete Konsequenzen haben, da Ihre Schleife möglicherweise neben den numerisch indizierten auch Attribute des Arrays aufnimmt.
edit - hier im Jahr 2015 ist es auch in Ordnung,
.forEach()
ein Array zu durchlaufen:Die
.forEach()
Methode ist auf dem Array-Prototyp ab IE9 vorhanden.quelle
Wenn Sie eine Erklärung innerhalb der
for
Überschrift nicht mögen , können Sie Folgendes tun:Wie in anderen Antworten auf diese Frage erwähnt, führt die
var
Nichtverwendung zu unnötigen Nebenwirkungen wie der Zuweisung einer globalen Eigenschaft.quelle
Verwenden Sie diejenige, mit der Sie die Schleifenvariable deklarieren
var
. Implizit deklarierte Variablen haben einen anderen Bereich, der wahrscheinlich nicht Ihren Vorstellungen entspricht.quelle
ist ein häufig gesehenes Muster, aber es unterscheidet sich von
in C ++ dahingehend, dass die Variable nicht auf den
for
Block beschränkt ist. Tatsächlich wird dervar
an die Spitze des umschließenden Bereichs (Funktion) gehisst, so dass ein lokaleri
sowohl vor demfor
Schleife (nach dem Beginn des aktuellen Bereichs / der aktuellen Funktion) .Mit anderen Worten:
ist das gleiche wie:
ES6 hat das
let
Schlüsselwort (anstelle vonvar
), um den Bereich auf den for-Block zu beschränken.Natürlich sollten Sie lokale Variablen (solche, die entweder mit
var
oderlet
oderconst
(in ES6) deklariert sind ) anstelle impliziter Globals verwenden.for(i=0; ...)
oderfor(i in ...)
schlägt fehl, wenn Sie"use strict";
(wie Sie sollten) verwenden undi
nicht deklariert sind.quelle
Die Verwendung
var
ist der sauberste Weg, aber beide funktionieren wie hier beschrieben: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inGrundsätzlich
var
stellen Sie durch die Verwendung sicher, dass Sie eine neue Variable erstellen. Andernfalls könnten Sie versehentlich eine zuvor definierte Variable verwenden.quelle
Ich denke, var ist aus Leistungsgründen gut.
Javascript durchsucht nicht den gesamten globalen Bereich, um festzustellen, ob x bereits an einer anderen Stelle vorhanden ist.
quelle
Aus allgemeiner Sicht bezieht sich die erste Version auf einen Index, der im Bereich der Schleife liegen muss, während die andere eine beliebige Variable im Bereich ist, in der der Konstruktor der Schleife aufgerufen wurde.
Wenn Sie den Index der Schleife in for loop verwenden möchten und dies in den nächsten Zeilen von anderen nicht benötigt wird, deklarieren Sie die Variable besser mit "var", damit Sie sicher sind, dass "x" für den mit 0 initialisierten Index der Schleife steht. Während die andere, wenn in diesem Kontext eine andere "x" -Variable verfügbar ist, diese vom Index der Schleife überschrieben wird - das sind einige logische Fehler -.
quelle