2012-07-09 18 views
7

Para este fragmento, no me sorprende variable global 'a' evalúa a ser 5.Intrigado por este fragmento de código JavaScript

http://jsfiddle.net/MeiJsVa23/gZSxY/:

var a = 10; 

function func(){ 
    a = 5; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // and this prints out 5 as expected. No surprise here. 
​ 

Pero ¿cómo es que para este fragmento de código, global variable 'a' evalúa ser 10 y no 5? Es como si el a = 5 nunca sucedió.

http://jsfiddle.net/MeiJsVa23/2WZ7w/:

var a = 10; 

function func(){ 
    a = 5; 
    var a = 23; 
} 

func(); // expect global variable 'a' to be modified to 5; 

alert(a); // but this prints out 10!! why? 

+0

Guau, creo que su pregunta ha sido respondida;) – mplungjan

Respuesta

0

El var a en la función se eleva a la parte superior del alcance de la función, por lo que se modifica la variable local, no la global.

0

Esto tiene que ver con izando.

En la función, se declara una variable local con el mismo nombre. Aunque ocurra después de la modificación, se considera que se ha declarado antes: se denomina elevación.

Las variables locales se alzan para la declaración pero no el valor. Por lo tanto:

function someFunc() { 
    alert(localVar); //undefined 
    var localVar = 5; 
} 

funciones, si se declara con function name() {... sintaxis, montacargas, tanto para la declaración y el valor.

function someFunc() { 
    alert(someInnerFunc()); //5 
    function someInnerFunc() { return 5; } 
} 
0
var a = 10; //a is 10 

function func(){ 
    a = 5; //a is 5 
    var a = 23; // a is now in local scope (via hoisting) and is 23 
} 

func(); 

alert(a); // prints global a = 10 
1

Esto se llama "variable hoisting". var declaraciones (y function() declaraciones) se mueven a la parte superior de su alcance.

0

Presumiblemente, la instrucción var a = 23 crea una variable local para todo el alcance. Por lo tanto, el a global se sombrea para la totalidad de func(), no solo para las líneas debajo de la declaración. Por lo tanto, en su segundo fragmento, a = 5 se está asignando a la variable local declarada a continuación.

2

Por lo tanto, hay dos cosas que van aquí: hoisting y shadowing.

Debido a que la primera de ellas, las declaraciones de variables se "cargó" a la parte superior, por lo que su código es equivalente a:

var a = 10; 

function func(){ 
    var a; 
    a = 5; 
    a = 23; 
} 

Y debido a que la segunda, que está "ensombrecidos" la variable global con a uno local, por lo que los cambios no se reflejan en el a global.

+0

+1 para el ejemplo y molestarse en explicar qué significa izar. –

Cuestiones relacionadas