2011-03-24 35 views
7
function A() { 
    function B() { 
      ... 
    }   
    B(); 
} 

Es la función B creada cada vez que se llama A o hay algo de almacenamiento en caché. No lo está haciendo local como:¿Las declaraciones de funciones locales se almacenan en caché?

function A() { 
    B(); 
} 
function B() { 
    ... 
} 

¿Una mejora en el rendimiento significativa?

¿Es válido hacer esto como una opción de estilo? (B en este caso es solo una función de ayuda para A.) O debería favorecer al segundo para la velocidad?

¿Se debe usar o evitar este estilo para facilitar la lectura?

Benchmark.

Parece FF4 en línea B para el caso local y elimina la sobrecarga de llamada a la función.

¿Qué pasa con otros navegadores?

+0

Declarar una función dentro de otra es malo. En tu primer ejemplo, B() debería haber sido una expresión. Consulte aquí: http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript – DanMan

+1

Parece que su caso de prueba no es correcto; en realidad no estás ejecutando las funciones, solo las declaras. Consulte http://jsperf.com/inner-function-optimization. Chrome no parece optimizar. Dudo que cualquier motor lo haga. – Matt

+0

@Matt Oh ... Olvidé llamarlos. Qué estúpido :( – Raynos

Respuesta

4

La declaración de una función interna en JS podría tener el propósito de estar vinculada léxicamente a las variables/argumentos locales de la función externa. Moverlo para que sea una función de alto nivel derrota ese propósito.

Respondió la pregunta: sí, la función interna se crea cada vez, al menos en teoría, y así es como se debe ver al escribir el código, pero un optimizador inteligente aún puede convertirlo en un nivel superior función, incluso si tiene dependencias léxicas. Si se trata de una micro-optimización, no me molestaría porque tener una función interna también sirve para legibilidad y para declarar tus intenciones.

0

Raynos, miré tus pruebas jsperf, y parece que estás probando la declaración de la función, no la ejecución de la función.

Consulte el enlace a continuación. ¿Eso es útil?

Another benchmark

diría que:

  1. En el código de ejemplo, B se crea cada vez que se invoca una. (En mi ejemplo vinculado a arriba, vea la prueba Ordinaria externa.)

  2. Porcentaje, la mejora en el rendimiento es significativa. Pero, si la función del mundo real se ejecuta en microsegundos, es posible que no note la diferencia.

  3. Otra consideración es cuán importante es para B (la función auxiliar) ser "privada" (en otras palabras, visible solo dentro de A). Vea la función Externa externa en mi enlace para una opción de en medio de la carretera.

+0

Es una lástima que los navegadores no optimicen esto con el almacenamiento en caché. – Raynos

0

Es extraño, porque supongo que volver a declarar una función cada vez que se llama a otra ralentizará el tiempo de ejecución.

¿Alguien tiene una respuesta a esto?

La única solución que se me ocurre es que la función C tiene que salir de su alcance, pasar a la función global, ejecutar la función D y luego regresar. Mientras que la función A permanece dentro de un alcance durante la ejecución. ¿Alguna idea?

+0

Reduce el tiempo de ejecución, mi punto de referencia no llamó a la función. – Raynos

Cuestiones relacionadas