¿Cuál es la forma correcta de escribir un for-inbucle 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 xse 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

varno 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 unavardeclaración. Si no puede encontrar un,varentonces 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 ien el bucle for, se muestra la alerta2.Elevación y alcance de JavaScript
fuente
varinterior de laforcabeza 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
xya 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únxno 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 elxes uno y el mismo se alertaráhey,there,there,hey,there,there. ¡No quieres eso! Úselovar xen susforbucles.Para colmo: si el
forbucle está en el alcance global (es decir, no en una función), entonces el alcance local (el alcancexse declara en si lo usavar x) es el mismo que el alcance global (el alcancexse declara implícitamente en si lo usaxsin 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
forencabezado, puede hacer:Como se mencionó en otras respuestas a esta pregunta, no usar
varen 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
forbloque. De hecho,varse eleva a la parte superior del alcance (función) adjunto, por lo que un localiestará disponible de manera efectiva tanto antes delforciclo (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
letpalabra clave (en lugar devar) para limitar el alcance al bloque for.Por supuesto, DEBERÍA utilizar variables locales (las declaradas con
varoletoconst(en ES6)) en lugar de globales implícitas.for(i=0; ...)ofor(i in ...)fallará si usa"use strict";(como debería) yino se declara.fuente
Usar
vares 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,
varse 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