Qual é a maneira correta de escrever um for-in
loop em JavaScript? O navegador não emite uma reclamação sobre nenhuma das duas abordagens que mostro aqui. Primeiro, há esta abordagem em que a variável de iteração x
é declarada explicitamente:
for (var x in set) {
...
}
E, alternativamente, essa abordagem que parece mais natural, mas não parece correta para mim:
for (x in set) {
...
}
javascript
syntax
for-in-loop
futlib
fonte
fonte
var
não foi utilizado para declarar o iteradori
:Uncaught ReferenceError: i is not defined
. Portanto, irei usá-lo de agora em diante: / webpack trata variáveis "globais" de maneira estranha, para obter mais informações, consulte: stackoverflow.com/a/40416826Respostas:
Use
var
, reduz o escopo da variável, caso contrário, a variável procura o fechamento mais próximo em busca de umavar
instrução. Se ele não puder encontrar um,var
então ele é global (se você estiver em um modo estritousing strict
, as variáveis globais geram um erro). Isso pode levar a problemas como os seguintes.Se você escrever
var i
no loop for, o alerta será exibido2
.Escopo e elevação de JavaScript
fonte
var
dentro dafor
cabeça parece que é local no loop for, o que não é. Portanto, prefiro o estilo do user422039 abaixo.A primeira versão:
declara uma variável local chamada
x
. A segunda versão:não.
Se
x
já for uma variável local (ou seja, você tem umvar x;
ou emvar x = ...;
algum lugar anterior em seu escopo atual (ou seja, a função atual)) então eles serão equivalentes. Sex
ainda não for uma variável local, o uso da segunda irá declarar implicitamente uma variável globalx
. Considere este código:você pode esperar que isso alerta
hey
,there
,heli
,hey
,there
,copter
, mas desde que ox
é uma ea mesma coisa vai alertarhey
,there
,there
,hey
,there
,there
. Você não quer isso! Usevar x
em seusfor
loops.Para completar: se o
for
loop estiver no escopo global (ou seja, não em uma função), então o escopo local (o escopox
é declarado em se você usarvar x
) é o mesmo que o escopo global (o escopox
é declarado implicitamente em se você usarx
sem var), então as duas versões serão idênticas.fonte
Você realmente deve declarar variáveis locais com
var
, sempre .Você também não deve usar loops "for ... in", a menos que tenha absoluta certeza de que é isso o que deseja fazer. Para iterar por meio de matrizes reais (o que é bastante comum), você deve sempre usar um loop com um índice numérico:
Iterar através de um array simples com "for ... in" pode ter consequências inesperadas, porque seu loop pode pegar atributos do array além dos indexados numericamente.
editar - aqui em 2015 também é bom usar
.forEach()
para iterar por meio de uma matriz:O
.forEach()
método está presente no protótipo do Array do IE9 em diante.fonte
Na verdade, se você não gosta de declarações no
for
cabeçalho, pode fazer:Conforme mencionado em outras respostas a esta pergunta, não usar
var
produz efeitos colaterais desnecessários, como atribuir uma propriedade global.fonte
Use aquele em que você declara a variável de loop com
var
. Variáveis declaradas implicitamente têm um escopo diferente que provavelmente não é o que você pretendia.fonte
é um padrão comumente visto, mas é diferente de
em C ++ em que a variável não tem como escopo o
for
bloco. Na verdade, ovar
é içado para o topo do escopo delimitador (função) para que um locali
esteja efetivamente disponível antes dofor
loop (após o início do escopo / função atual) e depois dele.Em outras palavras, fazer:
é o mesmo que:
ES6 tem a
let
palavra - chave (em vez devar
) para limitar o escopo ao bloco for.Claro, você DEVE usar variáveis locais (aquelas declaradas com
var
oulet
ouconst
(em ES6)) ao invés de globais implícitas.for(i=0; ...)
oufor(i in ...)
falhará se você usar"use strict";
(como deveria) ei
não for declarado.fonte
Usar
var
é a maneira mais limpa, mas ambos funcionam conforme descrito aqui: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inBasicamente, ao usar
var
você garante a criação de uma nova variável. Caso contrário, você pode acidentalmente usar uma variável definida anteriormente.fonte
Acho que var é bom por motivos de desempenho.
Javascript não examinará todo o escopo global para ver se x já existe em algum outro lugar.
fonte
De um ponto de vista geral, a primeira versão será para um índice que deve residir no escopo do loop, enquanto a outra seria qualquer variável no escopo onde o construtor do loop foi invocado.
Se você for usar o índice do loop dentro do loop for e isso não será exigido por outros nas próximas linhas, é melhor declarar a variável com "var" para ter certeza de que "x" é o índice do loop for inicializado com 0, enquanto a outra, se outra variável "x" estiver disponível neste contexto, ela será sobrescrita pelo índice do loop - que você terá alguns erros lógicos -.
fonte