2011-03-25 6 views
14

La diferencia b/w declaración de la función & expresión de función está muy bien descrito en var functionName = function() {} vs function functionName() {}
En este se menciona que declaración de la función se evalúa durante análisis sintáctico-tiempo, & expresión de función se evalúa en la ejecución de la fase¿declaración de función más rápida que la expresión de la función?

En bytes.com que es mencionó que la declaración de función es más rápida que la expresión de la función.

creé un caso básico prueba para esto: http://jsperf.com/function-declaration-vs-function-expression

Declaración de función:

function myfunc() { 
alert("yo"); 
} 
myfunc(); 

expresión de función:

var myfunc = function() { 
alert("yo"); 
} 
myfunc(); 

La prueba demostró que expresión de función es 90% más lento t Declaración de función Han.

¿Por qué tanta diferencia de velocidad?

Editar:
partir de los resultados en http://jsperf.com/function-declaration-vs-function-expression

En Chrome, IE9, Opera & Safari -> Declaración de función es más rápida que la expresión de funciones

En Firefox, IE7, IE8 -> expresión de función es más rápido que Declaración de función

En IE9 La declaración de función es más rápida, mientras que en IE 7 & 8 expresión de función es más rápido. ¿Es debido a un cambio en el motor de JavaScript en IE9, o fue este movimiento intencional?

+3

¿Qué navegador o motor de búsqueda de JavaScript está utilizando? –

+0

Es realmente más rápido en Firefox. –

+3

Esos resultados son bastante interesantes, mientras que es un 90% más lento en Chrome y Opera, en realidad es más rápido en FF. Diría que no importa demasiado, porque si declaras suficientes funciones que esto se convierte en un problema, estás haciendo algo mal. – idbentley

Respuesta

1

Esto tiene que ser un problema del navegador. Algunos navegadores pueden compilar el javascript de forma diferente si se trata de una expresión en lugar de una declaración y algunos pueden tratarlos exactamente igual.

2

Firefox también tiene Function Statements no estándar, lo que permite elegir condicionalmente entre declaraciones de función (por especificación, no se puede). Sólo mediante un example of Juriy "kangax" Zaytsev:

if (true) { 
    function foo(){ return 1; } 
} else { 
    function foo(){ return 2; } 
} 
foo(); // 1 
// Note that other clients interpet `foo` as function declaration here, 
// overwriting first `foo` with the second one, and producing "2", not "1" as a result 

Así que estos se compilan en tiempo de ejecución, en lugar de en la fase de análisis sintáctico:

declaraciones función no se declaran durante la instanciación variable. Se declaran en tiempo de ejecución, al igual que las expresiones de función.

Otros navegadores probablemente pre-compilar las declaraciones de funciones, por lo que realizan más rápido en tiempo de ejecución, pero Firefox tiene que interpretar las declaraciones de funciones en tiempo de ejecución, lo que no hay mucha diferencia entre la velocidad de las declaraciones de funciones y expresiones de función en Gecko navegadores basados ​​en

+0

_ "Firefox tiene que interpretar declaraciones de funciones en tiempo de ejecución" _ Eso es malo. ¿está arreglado en las nuevas versiones? – Anish

+0

@Anish: ¿Corregido? Es una [función] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/function): "JavaScript 1.5, NES 6.0: declaraciones de funciones condicionales añadidas (extensión Netscape)". Dicho eso, el equipo está trabajando para hacer que el motor JS sea lo más rápido posible. –

+0

del artículo de _kangax_ Entiendo que Firefox interpreta declaraciones de funciones en tiempo de ejecución solo si son parte de una declaración de función. Cuando las declaraciones de funciones se definen normalmente, supongo que están definidas durante el tiempo de análisis. – Anish

Cuestiones relacionadas