2011-10-03 10 views
5

No he podido encontrar una coincidencia exacta en mi problema, aunque existen muchas preguntas sobre el alcance de JavaScript. Aquí está mi código actual para la pregunta.Javascript Scoping Confusion

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    //var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

Cuando ejecuto esto, estoy alertado con "en blanco" y luego "uno" como se esperaba. Sin embargo, si elimino el comentario de esa línea, se verá así.

var my_var = "blank"; 
var MyFunc = function() { 
    my_var = "one"; 
    var my_var = "two"; 
} 
alert(my_var); 
MyFunc(); 
alert(my_var); 

Estoy alertado con "en blanco" y luego "en blanco". Esto no es lo que esperaría y me resulta confuso que agregar una línea eliminará el comportamiento. ¿Alguien puede explicar lo que está pasando aquí? Estoy viendo este comportamiento tanto en Firefox como en Safari.

+0

Sin embargo, otra buena razón para tener que utilizar variables locales con el mismo nombre que las variables globales simplemente es buscar problemas. – jfriend00

Respuesta

7

Todas las declaraciones var son efectivamente "elevadas" hasta la parte superior de su función envolvente (más o menos). Por lo tanto, el hecho de que tenga var my_varen cualquier lugar en esa función significa que todas las menciones de "my_var" hacen referencia a la variable local.

(dije "una especie de" debido a que la parte de la declaración de asignación var no se cambia, sólo la declaración de que el identificador debe ser una variable local.)

+0

documentos? cualquier cosa que confirme esto aparte del ejemplo? – Neal

+0

Para terminar su oración. El alzamiento hace 'my_var' una variable local dentro de la función completa. – jfriend00

+0

La especificación lo deja bastante claro. Sección 12.2. La especificación habla de variables que se "crean", y esa es la parte de "elevación". – Pointy

3

La razón se debe a que las declaraciones se izan dentro de una alcance de la función en JavaScript. Obtenga más información al respecto here.