"Var" o no "var" en el bucle "for-in" de JavaScript?

¿Cuál es la forma correcta de escribir un bucle for-in en JavaScript? El browser no emite una queja sobre ninguno de los dos enfoques que muestro aquí. En primer lugar, 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 que no me parece correcto:

 for (x in set) { ... } 

9 Solutions collect form web for “"Var" o no "var" en el bucle "for-in" de JavaScript?”

Use var , networkinguce el scope de la variable; de ​​lo contrario, la variable busca el cierre más cercano buscando una sentencia var . Si no puede encontrar una var entonces es global (si está en un modo estricto, el using strict variables using strict y globales arroja un error). Esto puede generar problemas como los siguientes.

 function f (){ for (i=0; i<5; i++); } var i = 2; f (); alert (i); //i == 5. i should be 2 

Si escribe var i en el ciclo for, la alerta muestra 2 .

JavaScript Scoping y elevación

La primera versión:

 for (var x in set) { ... } 

declara una variable local llamada x . La segunda versión:

 for (x in set) { ... } 

no.

Si x ya es una variable local (es decir, tiene una var x; o var x = ...; algún lugar anterior de su ámbito actual (es decir, la function actual)), entonces serán equivalentes. Si x no es ya una variable local, usar el segundo declarará implícitamente una variable global x . Considera este código:

 var obj1 = {hey: 10, there: 15}; var obj2 = {heli: 99, copter: 10}; function loop1() { for (x in obj1) alert(x); } function loop2() { for (x in obj2) { loop1(); alert(x); } } loop2(); 

puedes esperar que esto te heli , hey , heli , hey , there , copter , pero dado que el x es uno y el mismo alertará, hey , there , there , hey , there , there . ¡No quieres eso! Use var x en sus loops for .

Para colmo: si el bucle for está en el ámbito global (es decir, no en una function), entonces el scope local (el scope x se declara si usa var x ) es el mismo que el scope global (el scope x se declara implícitamente en si usa x sin var), por lo que las dos versiones serán idénticas.

Deberías declarar las variables locales con var , siempre .

Tampoco debería usar los loops "for … in" a less que esté absolutamente seguro de que eso es lo que quiere hacer. Para iterar a través de arreglos reales (que es bastante común), siempre debe usar un bucle con un índice numérico:

 for (var i = 0; i < array.length; ++i) { var element = array[i]; // ... } 

Iterar a través de una matriz simple con "para … en" puede tener consecuencias inesperadas, porque su ciclo puede recoger attributes de la matriz además de los indexados numéricamente.

editar – aquí en 2015 también está bien usar .forEach() para iterar a través de una matriz:

 array.forEach(function(arrayElement, index, array) { // first parameter is an element of the array // second parameter is the index of the element in the array // third parameter is the array itself ... }); 

El método .forEach() está presente en el prototipo de matriz desde IE9 hacia adelante.

En realidad, si no le gusta la statement dentro for encabezado, puede hacer:

 var x; for (x in set) { ... } 

Como se menciona en otras respuestas a esta pregunta, no usar var genera efectos queueterales innecesarios, como la asignación de una propiedad global.

Utilice el que declara la variable de bucle con var . Las variables declaradas implícitamente tienen un scope diferente que probablemente no sea el que pretendías.

Usar var es la manera más limpia, pero ambas funcionan como se describe aquí: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for…in

Básicamente, al usar var te aseguras de crear una nueva variable. De lo contrario, podría usar accidentalmente una variable previamente definida.

 for(var i = 0; ...) 

es un patrón comúnmente visto, pero es diferente de

 for(int i; ...) 

en C ++ en que la variable no tiene un scope para el bloque for . De hecho, la var se eleva a la parte superior del scope envolvente (function) para que un local i esté efectivamente disponible tanto antes del ciclo for (después del comienzo del scope / function actual) como después de él.

En otras palabras, hacer:

 (function(){ //beginning of your current scope; //... for(var i in obj) { ... }; })(); 

es lo mismo que:

 (function(){ //beginning of your current scope; var i; //... for(i in obj) { ... }; })(); 

ES6 tiene la palabra key let (en lugar de var ) para limitar el scope al bloque for.

Por supuesto, DEBE estar utilizando variables locales (las declaradas con var o let o const (en ES6)) en lugar de variables globales implícitas.

for(i=0; ...) o for(i in ...) fallará si usa "use strict"; (como deberías) y i no estoy declarado.

Creo que var es bueno por razones de performance.

Javascript no searchá en todo el scope global para ver si x ya existe en otro lugar.

Desde un punto de vista general, la primera versión será para un índice que debe vivir dentro del scope del bucle, mientras que la otra sería cualquier variable en el ámbito donde se invocó el constructor del bucle.

Si va a utilizar el índice de bucle dentro para el bucle y otros no lo necesitarán en las líneas siguientes, mejor declare la variable con "var", así que estará seguro de que "x" es para el índice del bucle inicializado con 0, mientras que el otro, si hay otra variable "x" disponible en este context, esto será sobreescrito por el índice de bucle, es decir, tendrá algunos errores lógicos.

  • Qué hace <| en este código significa?
  • ¿Puedo usar una identificación como nombre de variable?
  • Operación de comparación - ¿Corregir syntax?
  • Mostrar file de text en JavaScript
  • ¿Cuál sería un nombre mejor para "esto" de Javascript?
  • ¿Debo utilizar comillas dobles o comillas simples para comillas si quiero ser coherente en varios idiomas?
  • javascript cómo inicializar la matriz de uso de objects
  • Declaración de variables apropiada para / en
  • ¿Cuál es el significado de "=>" (una flecha formada por iguales y mayores que) en JavaScript?
  • ¿Por qué "palabra:" en el inicio de algunas declaraciones de JavaScript no arroja un error de syntax?
  • ¿Cómo defines un lenguaje que no está comstackdo?
  • Mejor resaltado de syntax para Javascript en Notepad ++
  • Extraña syntax de los methods numéricos en JavaScript
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.