¿Cuál es la forma correcta de escribir un for-in
bucle en JavaScript? El navegador no emite una queja sobre ninguno de los dos enfoques que muestro aquí. Primero, existe este enfoque donde la variable de iteración x
se declara explícitamente:
for (var x in set) {
...
}
Y, alternativamente, este enfoque que se lee de forma más natural pero no me parece correcto:
for (x in set) {
...
}
javascript
syntax
for-in-loop
futlib
fuente
fuente
var
no se utiliza para declarar el iteradori
:Uncaught ReferenceError: i is not defined
. Así que lo usaré de ahora en adelante: / webpack trata las variables "globales" de manera extraña, para obtener más información, consulte: stackoverflow.com/a/40416826Respuestas:
Use
var
, reduce el alcance de la variable, de lo contrario, la variable busca el cierre más cercano buscando unavar
declaración. Si no puede encontrar un,var
entonces es global (si está en un modo estrictousing strict
, las variables globales arrojan un error). Esto puede provocar problemas como los siguientes.Si escribe
var i
en el bucle for, se muestra la alerta2
.Elevación y alcance de JavaScript
fuente
var
interior de lafor
cabeza parece que es local en el ciclo for, que no lo es. Por lo tanto, prefiero el estilo de user422039 a continuación.La primera versión:
declara una variable local llamada
x
. La segunda versión:no.
Si
x
ya es una variable local (es decir, tiene unavar x;
o envar x = ...;
algún lugar anterior en su alcance actual (es decir, la función actual)) entonces serán equivalentes. Si aúnx
no es una variable local, entonces el uso de la segunda declarará implícitamente una variable globalx
. Considere este código:se podría esperar que esto alerta
hey
,there
,heli
,hey
,there
,copter
, pero ya que elx
es uno y el mismo se alertaráhey
,there
,there
,hey
,there
,there
. ¡No quieres eso! Úselovar x
en susfor
bucles.Para colmo: si el
for
bucle está en el alcance global (es decir, no en una función), entonces el alcance local (el alcancex
se declara en si lo usavar x
) es el mismo que el alcance global (el alcancex
se declara implícitamente en si lo usax
sin una var), entonces las dos versiones serán idénticas.fuente
Realmente debería declarar variables locales con
var
, siempre .Tampoco debería utilizar bucles "for ... in" a menos que esté absolutamente seguro de que eso es lo que quiere hacer. Para iterar a través de matrices reales (que es bastante común), siempre debe usar un bucle con un índice numérico:
Iterar a través de una matriz simple con "for ... in" puede tener consecuencias inesperadas, porque su ciclo puede recoger atributos de la matriz además de los indexados numéricamente.
editar - aquí en 2015 también está bien usarlo
.forEach()
para iterar a través de una matriz:El
.forEach()
método está presente en el prototipo Array desde IE9 en adelante.fuente
En realidad, si no le gusta la declaración dentro del
for
encabezado, puede hacer:Como se mencionó en otras respuestas a esta pregunta, no usar
var
en absoluto produce efectos secundarios innecesarios, como asignar una propiedad global.fuente
Use el que declara la variable de ciclo con
var
. Las variables declaradas implícitamente tienen un alcance diferente que probablemente no sea el que pretendía.fuente
es un patrón que se ve comúnmente, pero es diferente de
en C ++ en el sentido de que la variable no tiene el alcance del
for
bloque. De hecho,var
se eleva a la parte superior del alcance (función) adjunto, por lo que un locali
estará disponible de manera efectiva tanto antes delfor
ciclo (después del comienzo del alcance / función actual) como después de él.En otras palabras, haciendo:
es lo mismo que:
ES6 tiene la
let
palabra clave (en lugar devar
) para limitar el alcance al bloque for.Por supuesto, DEBERÍA utilizar variables locales (las declaradas con
var
olet
oconst
(en ES6)) en lugar de globales implícitas.for(i=0; ...)
ofor(i in ...)
fallará si usa"use strict";
(como debería) yi
no se declara.fuente
Usar
var
es la forma más limpia, pero ambos funcionan como se describe aquí: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inBásicamente, al usarlo,
var
se asegura de crear una nueva variable. De lo contrario, podría utilizar accidentalmente una variable definida previamente.fuente
Creo que var es bueno por razones de rendimiento.
Javascript no examinará todo el alcance global para ver si x ya existe en algún otro lugar.
fuente
Desde un punto de vista general, la primera versión será para un índice que debe vivir dentro del alcance del bucle, mientras que la otra sería cualquier variable en el alcance donde se invocó el constructor del bucle.
Si va a usar el índice del bucle dentro del bucle for y esto no será requerido por otros en las siguientes líneas, mejor declare la variable con "var" para asegurarse de que "x" es el índice del bucle for inicializado con 0, mientras que el otro, si hay otra variable "x" disponible en este contexto, se sobrescribirá con el índice del bucle, es decir, tendrá algunos errores lógicos.
fuente