2012-09-07 15 views
5

poco curioso de código aquí ...¿Por qué esta alerta 5?

var x = 5; 

function fn() { 
    x = 10; 
    return; 
    function x() {} 
} 
fn(); 
alert(x); 

Aquí está la jsFiddle

Está function x() {} llama en absoluto después de return? ¿Por qué no alerta 10?

+1

Bizarre ... Si comenta la línea 'function x() ...', alerta '10'. – Shmiddty

Respuesta

10

function x() {} es hoisted al inicio del alcance fn 's, y esto hace que efectivamente x se evalúa una variable local antes .

La función es no establecida en 10.

Actualización: La frase anterior es incorrecta. x en realidad se establece en 10. var no se utiliza para declarar, pero incluso si lo fuera, la última frase en la cita a continuación sólo se refiere a la declaración parte del nombre x, no su asignación a 10.

De MDN (el énfasis es mío):

función

Tres formas con diferentes comportamientos alcance:

  • declarada: como una declaración en la parte superior función madre -level
    • se comporta como una unión que var consigue inicializan a esa función
    • inicialización "montacargas" a lo más alto de la función madre, por encima de vars

var

  • alcance funcional
  • alzar a la cima de su función
  • redeclarations del mismo nombre en el mismo ámbito hay-ops
+1

Claro e informativo, gracias! –

+1

¿Quiere decir "preceder" en lugar de "reemplazar"? El 'x = 10' todavía se evalúa y la función se sobrescribe con' 10'. –

+1

@user, whoops, tienes toda la razón, tomé en cuenta una palabra clave 'var' que no estaba allí. Gracias por el aviso, arreglaré esto de inmediato. –

3

función x flotan en la superficie, por lo que la asignación de la función a 10

0

Esto se debe a fn es un objeto, y x es una propiedad de ese objeto. Local-scope siempre toma precisión sobre los globales.

+0

Esto es totalmente incorrecto. La 'x' no es una propiedad del objeto de función. –

+0

Claro que sí, revise este violín: http://jsfiddle.net/f7tRR/5/ – Matthew

+0

En JavaScript hay una clara distinción entre variables y propiedades. La 'x' definida por la declaración de función crea una variable que no tiene relación directa con el objeto' fn'. Se crea un ámbito de variable invocando el objeto de función, pero las variables nunca se convierten en propiedades del objeto. –

2

Usted declara la función x dentro de fn; por lo tanto, está utilizando la versión con ámbito local de x. No importa en qué punto se declara la función x. Lo que está haciendo en realidad cuando se establece x a 10 es que está configurando la función de x a 10.

2

This code alertas también 5:

var x = 5; 

function fn() { 
    x = 10; 
    return; 
    var x; 
} 
fn(); 
alert(x);​ 

El punto importante es que se está declarando una variable local x. Al declarar una variable después de, la declaración de devolución tampoco importa: sigue siendo una variable local.

Elimina la declaración y obtienes 10 porque la x ya no es una variable local.

0

X en fn() es una función pero x en el alcance global es una var

eliminar la función de x() {} la parte yx serán alertados 10

1

Esto se debe a la forma en que funciona la elevación variable en JavaScript. Las declaraciones variables son izadas, pero no sus asignaciones. Las declaraciones de funciones también se elevan junto con el cuerpo de la función (aunque las expresiones de función no lo son).

lo que el código está haciendo efectivamente esto:

var x = 5; 

function fn() { 
    var x; 
    x = function() {} 
    x = 10; 
    return; 
} 
fn(); 
alert(x); 

El x dentro de la función se declara, por tanto, con sólo el ámbito local y no afecta a la x decalred en el código principal.