Jaki jest właściwy sposób pisania for-in
pętli w JavaScript? Przeglądarka nie zgłasza reklamacji żadnego z dwóch podejść, które tu pokazuję. Po pierwsze, istnieje takie podejście, w którym zmienna iteracji x
jest jawnie zadeklarowana:
for (var x in set) {
...
}
I alternatywnie to podejście, które brzmi bardziej naturalnie, ale nie wydaje mi się poprawne:
for (x in set) {
...
}
javascript
syntax
for-in-loop
futlib
źródło
źródło
var
nie był używany do deklarowania iteratori
:Uncaught ReferenceError: i is not defined
. Więc od teraz będę go używać: / webpack dziwnie traktuje zmienne „globalne”, więcej patrz: stackoverflow.com/a/40416826Odpowiedzi:
Użyj
var
, zmniejsza zakres zmiennej, w przeciwnym razie zmienna wyszukuje najbliższe zamknięcie w poszukiwaniuvar
instrukcji. Jeśli nie może znaleźćvar
a, to jest globalne (jeśli jesteś w trybie ścisłymusing strict
, zmienne globalne generują błąd). Może to prowadzić do problemów, takich jak następujące.Jeśli napiszesz
var i
w pętli for, pojawi się alert2
.JavaScript Scoping and Hoisting
źródło
var
wnętrzafor
głowy wygląda jak lokalnie w pętli for, ale tak nie jest. Dlatego wolę styl user422039 poniżej.Pierwsza wersja:
deklaruje lokalną zmienną o nazwie
x
. Druga wersja:nie.
Jeśli
x
jest już zmienną lokalną (tj. Maszvar x;
lubvar x = ...;
gdzieś wcześniej w swoim obecnym zakresie (tj. Bieżącej funkcji)) to będą równoważne. Jeślix
nie jest już zmienną lokalną, użycie drugiej spowoduje niejawne zadeklarowanie zmiennej globalnejx
. Rozważ ten kod:można się spodziewać to alert
hey
,there
,heli
,hey
,there
,copter
, ale ponieważx
jest jedno i to samo będzie ostrzegaćhey
,there
,there
,hey
,there
,there
. Nie chcesz tego! Użyjvar x
w swoichfor
pętlach.Na dodatek: jeśli
for
pętla znajduje się w zasięgu globalnym (tj. Nie jest w funkcji), wówczas zasięg lokalny (zasięgx
jest zadeklarowany w przypadku użyciavar x
) jest taki sam jak zasięg globalny (zakresx
jest niejawnie zadeklarowany w jeśli używaszx
bez var), więc obie wersje będą identyczne.źródło
Naprawdę powinieneś zawsze deklarować zmienne lokalne za pomocą
var
, zawsze .Nie powinieneś także używać pętli „for ... in”, chyba że masz absolutną pewność, że właśnie tego chcesz. Do iteracji po prawdziwych tablicach (co jest dość powszechne), zawsze powinieneś używać pętli z indeksem numerycznym:
Iterowanie po zwykłej tablicy z „for ... in” może mieć nieoczekiwane konsekwencje, ponieważ pętla może pobierać atrybuty tablicy oprócz atrybutów indeksowanych numerycznie.
edytuj - tutaj w 2015 można również użyć
.forEach()
do iteracji po tablicy:.forEach()
Metoda jest obecny na prototypie Array z IE9 przodu.źródło
Właściwie, jeśli nie lubisz deklaracji w
for
nagłówku, możesz zrobić:Jak wspomniano w innych odpowiedziach na to pytanie, nieużywanie
var
w ogóle powoduje niepotrzebne skutki uboczne, takie jak przypisanie właściwości globalnej.źródło
Użyj tego, w którym deklarujesz zmienną pętli za pomocą
var
. Zmienne zadeklarowane niejawnie mają inny zakres, który prawdopodobnie nie jest tym, co zamierzałeś.źródło
to powszechnie spotykany wzór, ale różni się od
w C ++ pod tym względem, że zmienna nie jest objęta zakresem
for
bloku. W rzeczywistościvar
zostaje on podniesiony do góry otaczającego zakresu (funkcji), więc lokalnai
będzie efektywnie dostępna zarówno przedfor
pętlą (po rozpoczęciu bieżącego zakresu / funkcji), jak i po niej.Innymi słowy, robiąc:
jest taki sam jak:
ES6 ma
let
słowo kluczowe (zamiastvar
) ograniczające zakres do bloku for.Oczywiście POWINIENEŚ używać zmiennych lokalnych (zadeklarowanych za pomocą
var
orlet
lub lubconst
(w ES6)) zamiast niejawnych zmiennych globalnych.for(i=0; ...)
lubfor(i in ...)
zawiedzie, jeśli użyjesz"use strict";
(tak jak powinieneś) ii
nie zostanie zadeklarowany.źródło
Używanie
var
jest najczystszym sposobem, ale oba działają zgodnie z opisem tutaj: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inZasadniczo, używając
var
, upewnij się, że utworzysz nową zmienną. W przeciwnym razie możesz przypadkowo użyć wcześniej zdefiniowanej zmiennej.źródło
Myślę, że var jest dobry ze względu na wydajność.
Javascript nie przejrzy całego zakresu globalnego, aby sprawdzić, czy x już istnieje gdzieś indziej.
źródło
Z ogólnego punktu widzenia, pierwsza wersja będzie dotyczyła indeksu, który musi znajdować się w zakresie pętli, a druga będzie dowolną zmienną w zakresie, w którym został wywołany konstruktor pętli.
Jeśli zamierzasz użyć indeksu pętli wewnątrz pętli for i nie będzie to wymagane przez inne osoby w następnych wierszach, lepiej zadeklaruj zmienną za pomocą „var”, dzięki czemu będziesz mieć pewność, że „x” oznacza indeks pętli zainicjowany wartością 0, podczas gdy druga, jeśli inna zmienna "x" jest dostępna w tym kontekście, zostanie nadpisana przez indeks pętli - to znaczy, że będziesz mieć pewne błędy logiczne -.
źródło