2010-03-30 13 views
6

Por favor alguien puede explicar la diferencia entre las siguientes definiciones de las funciones?Una simple pregunta acerca de las funciones de Javascript, las diferencias en la invocación/definición

var alertMessage = function alertMessage(message) { 
    alert(message); 
} 

var alertMessage = function(message) { 
    alert(message); 
} 

¿Cuáles son las implicaciones de cada uno? ¡Gracias!

+0

análisis pertinentes: http://yura.thinkweb2.com/named-function-expressions/ (en particular, consulte la sección "función llamada expresiones") –

+0

Leer esta respuesta te creo encontrará toda la información que necesita: http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname/338053#338053 –

Respuesta

2

Ambos son expresiones de función, básicamente la diferencia es que el primero se nombra y el segundo es anónimo.

Por ejemplo:

var test = function test(message) { 
    alert(message); 
}; 

var test1 = function(message) { 
    alert(message); 
}; 

test.name; // "test" 
test1.name // "" or "anonymous" 

Nota: La propiedadname de objetos de función existe en algunas implementaciones, pero es no estándar.

Además, el nombre de la función expresiones que es útil para la depuración, como se puede inspeccionar la pila de llamadas para ver dónde se encuentra.

Este identificador es sólo accesible desde el interior del propio FunctionBody:

(function foo(){ 
    typeof foo; // "function" 
})(); 
typeof foo; // "undefined" 

sin embargo hay una bug sobre la aplicación de JScript (en todas las versiones de IE), que este nombre se filtró a su ámbito de inclusión.

+1

de peor que el error, sino que también asegura que la función se pone creado dos veces, una vez al comienzo del alcance adjunto y una vez en el tiempo de asignación.Si asignó una variable con un nombre diferente, tendría dos copias no iguales de la misma función (lo que puede causarle problemas si está haciendo una clase para comparar con 'instanceof'!). Mejor: evitar las expresiones de función en línea con nombre. – bobince

+0

Sí @bobince el comportamiento es tan malo que se ha convertido en una simple regla de "no hacer eso" para mí, lo cual es una lástima ya que es muy útil. Erlang no tiene forma de hacer esto (básicamente un "letrec") y es un verdadero dolor. – Pointy

+0

@bobnice, @Pointy: Sí, creo que es una de las desviaciones más horrendas de ECMA Standard, y ¿saben chicos, que este error todavía está presente en el ** IE9 ** Platform Preview? !!, el identificador pierde su ámbito de aplicación, pero parece que solo se creó una instancia de función ... :-( – CMS

2

Ambas definiciones son las expresiones de función, en lugar de funcionar declaraciones o funciones creadas por el Function constructor. Ambos asignan una función a la variable alertMessage. La diferencia es que la primera función se nombra, mientras que la segunda es anónima.

funciones con nombre se utilizan generalmente en las declaraciones de funciones, por ejemplo

function alertMessage(message) { ... } 

En ese caso, la declaración de la función crea una variable en el ámbito actual llamada alertMessage que hace referencia a esa función. Las declaraciones de funciones se elevan a la parte superior del alcance actual, de modo que puede llamar a las funciones declaradas antes de que se definan en su archivo js.

Una función nombrada utilizada en una expresión de función (como la pregunta original) no crea esta variable, ni es elevada al alcance de ejecución, por convención la mayoría de las expresiones de función son anónimas. Los únicos beneficios para nombrar una expresión de función son que la variable name está obligado dentro de la función (aunque, como se menciona CMS, esto depende de la implementación) y el nombre de la función se emite por el método de la función toString. Esto puede ser útil durante la depuración (en lugar de tener salida de Firebug (?) para una enorme lista de llamadas a funciones anónimas).

Mucho más detalle MDC

Cuestiones relacionadas