2011-05-18 23 views
6

Quizás no conozco cómo se obtienen las variables de índice de bucle for, pero me sorprendió mucho cuando uno de mis bucles no se completó, aparentemente porque una función llamada desde dentro de un bucle contenía i para su índice de bucle for como bien.Javascript para variables de índice de bucle se vuelven parte del alcance global?

Aquí hay un pequeño script que puse juntos para demostrar este comportamiento:

var loopOne = function(test) { 
    for(i = 0; i < test.length; i++) 
     console.log(getMask(test)); 
}; 

var getMask = function(pass) {  
    var s = ""; 
    for (i = 0; i < pass.length; i++) { 
     s = s + "*"; 
    } 
    return s;  
}; 

loopOne('hello'); 

Si funciono esto en Chrome y miro el registro de la consola, que debería ver ***** cinco veces. Sin embargo, solo lo veo una vez. Tras una inspección adicional, si escribo i en la consola JavaScript de Chrome, obtendrá una salida 6 (= 'hello'.length + 1). Esto me hace pensar que i se ha convertido en una parte del alcance global y no se limita al alcance del bucle for para el que se necesitó.

¿Es esto correcto? Si es así, ¿cuál es una mejor práctica para definir la variable de índice de un bucle for en javascript?

Respuesta

12

En Javascript, las variables están en el ámbito con la palabra clave var. Al declarar variables con var, la variable tiene un alcance para la función actual. Al asignar una variable sin utilizar la palabra clave var, se supone que está hablando de una variable ya definida en el mismo ámbito o en un ámbito superior. Si no se encuentra ninguno, la variable se crea en el ámbito más alto.

En pocas palabras: declare todas sus variables usando var.

+1

"Si no se encuentra ninguno, la variable se crea en el ámbito más alto". Eso es simplemente malo. Gracias por la explicación sobre el alcance utilizando 'var'. Ahora que lo mencionas, debería haberlo recordado. –

+0

@Ben De hecho, es una de las muchas trampas de Javascript. AFAIK esto está siendo/fue corregido en la última especificación de ECMAScript. – deceze

+0

Creo que solo si agrega '" use strict "'. – alex

8

Usted debe declarar siempre variables con var:

for(var i = 0; i < test.length; i++) ... 
4

Cuando declara sus variables con var, las orienta al contexto de ejecución actual.

Cuando no lo hace, se convierten en propiedades del objeto global (window en un navegador).

Cuestiones relacionadas