2011-06-14 8 views
9

¿Alguien podría explicar por qué los dos a continuación no son iguales? Básicamente estoy tratando de descubrir qué está sucediendo detrás de escena. Tengo entendido que ambos se refieren a la misma función, pero ese no parece ser el caso.Referencias de funciones - ¡Por favor, ilumínalo!

var foo = function bar() {} 

typeof foo //"function" 
typeof bar //"function" 

foo === bar //false 
foo == bar //false 
+2

¿Lo ejecutó en el orden en que lo vemos? –

+0

Solo para su información, si desea que se refieran a la misma función, quiere algo como 'var foo = function() {}, bar = foo;' o 'function bar() {}; var foo = bar'. Entonces, si los comparas, serán iguales. – brymck

+1

Debe estar utilizando IE8 o inferior. Es un error conocido en el que no solo se filtra 'barra' dentro del alcance de la variable envolvente, sino que se crea un objeto función único y se asigna a 'barra'. Es por eso que 'bar' es una función, pero' foo' no es igual a 'bar'. – user113716

Respuesta

5

Yo no sé ustedes, pero mis navegadores regrese para undefinedtypeof bar

typeof bar //"undefined" 

demostración http://jsfiddle.net/gaby/t8Czr/


La referencia bar al método sólo está disponible en el interior del propio método ..

+0

Tienes razón. Estaba leyendo un artículo y lo probé en la consola Firebug y pensé que obtuve el resultado que presencié. Lamentablemente, el código exacto que ejecuté ya no existe. –

2

Bar i s no definido. Bar solo existe dentro del alcance de foo.

Si declara primero la barra y establece foo igual a la barra, los resultados serán los esperados.

2

Esta es una expresión de función nombrada debido a la asignación a foo. En una expresión de función nombrada, el nombre de la función solo está disponible dentro del alcance adjunto de la función, pero no en el exterior.

Fuera de esto simplemente no estará definido.

var foo = function bar() { typeof bar; /* function */ }; 
bar; // undefined 

Tenía la tarea de foo no hubiera estado allí, esto habría sido una declaración de función y el identificador bar hubiera estado disponible en todo el ámbito que lo contiene, incluso antes de la función declarada.

typeof bar; // function 
function bar() {} 

Esta es una good article para entender cómo funcionan las expresiones de función con nombre y cómo se diferencian de las declaraciones de funciones.

Cuestiones relacionadas