2012-07-20 19 views
5

Dado el siguiente código, ¿qué debo esperar ver en la alerta?Alcance de la función anónima pasada como argumento de función

var a = 100; 
function afunc(infunc){ 
    a = 10; 
    infunc.call(); 
} 

afunc(function(){alert(a)}); 

Mi idea inicial era que el navegador debe alertar 100 ya que la variable a = 100 estaría en posibilidades de la función anónima pasa como argumento a afunc. Pero esto supone que la función anónima en realidad está definida en el contexto global. Aparentemente, ese no es el caso ya que el navegador alerta 10. Entonces, ¿por qué a = 10 está por delante de a = 100 en la cadena de alcance?

Gracias!

Respuesta

6

Porque está configurando un 10 antes de llamar a la función anónima. a es de hecho global, pero lo está configurando a 10.

+3

Facepalm! Ahora me siento tonto. –

+0

sí, es razón correcta –

6

Entonces, ¿por qué a = 10 está por encima de a = 100 en la cadena de alcance?

No lo es. Solo ha definido la variable 1 a, que simplemente se está cambiando de 100 a 10 antes de recibir una alerta.

Si desea que los a s como variables distintas con sus propios valores, que ambos necesitan una palabra clave var:

var a = 100 
function afunc(infunc){ 
    var a = 10; 
    infunc.call(); 
} 

afunc(function(){alert(a)})​ 
1

Considere el siguiente ejemplo:

var a = 100; 

function afunc(infunc){ 
    a = 10; 
    var f = function(){ 
    console.log(a); 
    }; 
    f.call(); 
    infunc.call(); 
} 

afunc(function(){ console.log(a); }); 

asignamos un valor de 10 a a dentro del alcance de afunc, y luego llama a dos funciones una detrás de otra que simplemente registran el valor de a. En este caso, esperaría que ambas funciones registraran 10 como el valor de a, y eso es lo que ocurre.

En su ejemplo, infunc se ejecutará esencialmente en el mismo ámbito que cualquier función local definida en afunc, independientemente de dónde se haya definido realmente. Dado que asignó un valor a a en un ámbito más estrecho, ese es el valor de a cuando llama al infunc.

Funciones hacer conservan un cierto margen de su definición, como en el siguiente ejemplo:

function bfunc(){ 
    var b = 'hello'; 
    return function(){ console.log(b); }; 
} 

afunc(bfunc()); 

Aquí, la función anónima devuelto por bfunc en realidad se llama desde dentro del alcance de afunc, pero aún así es capaz para registrar el valor correcto de b tal como se asignó en el alcance original. Si tuviera que cambiar afunc para asignar un valor diferente a b, todavía registraría "hello" porque el b definido en afunc es una variable diferente de b definida en bfunc.

Cuestiones relacionadas