2012-03-01 24 views
8

Digamos que tiene una función simple que alerta a un mensaje:¿Por qué funciona este cierre?

function callMessage(msg){ 
     alert(msg); 
    } 

Ahora, cuando lo llamo como tal, no funciona. Tiros de error "oye no está definido"

function sayHi(){ 
     var hey = "hi there" 
     setTimeout("callMessage(hey)", 1000); 
    } 
    sayHi(); 

Pero cuando lo llamo el interior de una función anónima que hace el trabajo:

function sayHi(){ 
     var hey = "hi there" 
     setTimeout(function(){callMessage(hey);}, 1000); 
    } 
    sayHi(); 

¿Por qué es la variable "bueno" sólo es visible cuando lo puse dentro de una ¿función anónima?

+1

lo haría también prueba esto; 'setTimeout (" var hey = 'hola allí'; callMessage (hey) ", 1000);' – mindandmedia

+0

Si fuera usted, leería algo así como - http://www.digital-web.com/articles/scope_in_javascript/ –

Respuesta

14

En el primer ejemplo, el código se evalúa después de el temporizador expiró y se dejó el ámbito actual. hey no está definido en ese momento.

El segundo ejemplo, la forma correcta de usar setTimeout, usa una función anónima creada al invocar setTimeout(). Esta función anónima también recibe una copia del alcance actual.

+0

En el segundo ejemplo, el cuerpo del cierre no se evalúa hasta entonces tampoco. – sepp2k

+2

No se * ejecutó * hasta más tarde. El primero es * literalmente * evaluado ('eval()') sin indicación de qué ámbito se va a utilizar porque es "solo una cadena". –

+0

Eso tiene sentido. No sabía que las funciones anónimas tienen una copia de su alcance principal – levi

6

"callMessage (hey)" es una cadena, no un cierre. Se evalúa cuando se ejecuta el tiempo de espera, y en este momento la variable hey no está dentro del alcance.

3

es normal.

El segundo ejemplo crea lo que llamamos un accesorio, este es un contexto de ejecución. hey variable variable se guarda para ser utilizada por la función anónima en la memoria.

En el primer ejemplo, el apogeo variable no se guarda en un accesorio (porque Javascript no puede saber que va a utilizado la variable después) y por tanto no puede ser recuperada cuando la cadena se evalúa

Cuestiones relacionadas