variable name es6 dynamically create javascript variables for-loop scope

name - Alcance variable de bucle de JavaScript



object name dynamic javascript (5)

Solo una pregunta rápida sobre el alcance de las variables de JavaScript.

¿Por qué la función alert() imprime el valor de i lugar de devolver undefined ?

$(document).ready(function () { for(var i = 0; i < 10; i += 1){ } alert("What is ''i''? " + i); });

Soy bastante nuevo en JS, y en casi todos los otros idiomas que he incursionado, una declaración en el alcance del bucle for contendría el valor de dicho bucle, pero no en este caso, ¿por qué?

es decir, What is ''i''? 10'' What is ''i''? 10'' está impreso.


¡La gente de JavaScript está tratando de arreglar esto!

EcmaScript6 (también conocido como EcmaScript 2015) es la última versión de javascript que se aprobó el verano pasado y los navegadores están comenzando a admitir sus características.

Una de esas características son las variables locales de alcance de bloque con la expresión "let". A partir de ahora (abril de 2016), la mayoría de las versiones actuales de los principales navegadores admiten esto, excepto Safari. Pocos navegadores móviles lo admiten.

Puedes leer más sobre esto aquí (en particular, ver la sección "variables con ámbito de lectura en bucles for"): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

Puede consultar el soporte de navegador actual aquí (busque los Enlaces de fila -> dejar): https://kangax.github.io/compat-table/es6/


A diferencia de otros lenguajes (por ejemplo: Java, C ++, C), JavaScript no admite el alcance del bloque. Una vez que declara una variable en un bucle o en una función, su alcance está dentro del cuerpo de la función si lo hace

for(i=0; i<arr.length; i++) { var j=0; // ... }

aquí, su i convierte en una variable global y se convierte en local para la función o script en el que se encuentra el ciclo.


JavaScript no tiene ámbito de bloque, solo alcance de función. Como la inicialización de i está dentro de una función, esa variable es accesible desde cualquier otro lugar en esa misma función.

De MDN :

Importante: JavaScript no tiene alcance de bloque. Las variables introducidas con un bloque tienen un alcance para la función o script que contiene, y los efectos de establecerlas persisten más allá del bloque mismo. En otras palabras, las instrucciones de bloque no introducen un alcance. Aunque los bloques "independientes" son sintaxis válidos, no desea usar bloques independientes en JavaScript, porque no hacen lo que cree que hacen, si cree que hacen algo parecido a dichos bloques en C o Java.


Ver el MDN para los " parámetros de inicialización " de un bucle for :

Una expresión (incluidas las expresiones de asignación) o declaración de variable. Normalmente se usa para inicializar una variable de contador. Esta expresión puede declarar opcionalmente nuevas variables con la palabra clave var. Estas variables no son locales para el ciclo, es decir, están en el mismo ámbito en el que está el ciclo for. El resultado de esta expresión se descarta.


for(i=0; i<arr.length; i++) { var j=0; // ... }

no es correcto decir que lo anterior crea una variable global i . Creo que siempre debes usar var para declarar variables (a menos que intencionalmente quieras una "propiedad" en lugar de una "variable", lo cual es bastante improbable en el 99,99% de los escenarios de codificación de JS ...)

Omitir var al asignar un valor inicial a i no está creando una variable local o incluso global, está creando una propiedad i para el objeto global (que puede parecer / comportarse principalmente como una variable global, pero tienen algunas diferencias sutiles) .

mejor sería:

var i; for(i=0; i<arr.length; i++) { var j=0; // ... }

ahora el ciclo está usando una variable global i (o función variable local i , si este código aparece en una función)

vea más sobre esto en lo que es función de la palabra clave var y variables vs. propiedades en Javascript

- nota, lo que es un poco confuso es que puedes volver a declarar una variable, por ejemplo, en un segundo ciclo

for(var i=0; i<9; i++){ document.write(''i = '' + i + ''<br>''); } for(var i=0; i<9; i++){ document.write(''i = '' + i + ''<br>''); }

esto parece ser válido (no hay errores cuando pruebo). Parece que PUEDE volver a declarar las variables en JavaScript, pero probablemente no sea una buena idea, a menos que sea un caso especial, vea esta pregunta relacionada que menciona cómo [Google Analytics utiliza la redeclaración ''segura'' de una variable] ( Redeclar una variable javascript )

hay alguna discusión sobre volver a declarar las variables en JS (y también variables de bucle como i ) en esta pregunta SO relacionada: declarar variables dentro o fuera del bucle

Hay un evento de un patrón de JavaScript para la declaración única de variables