Pregunta

¿La colocación de una función tiene un efecto en el rendimiento de los cierres dentro del alcance? Si es así, ¿dónde está el lugar óptimo para poner estas funciones? Si no es así, ¿la asociación implícita por cierre es razón suficiente para colocar una función en otro lugar de manera lógica?

Por ejemplo, si foo no se basa en el valor de localState , el hecho de que localState sea accesible desde foo tiene implicaciones en cuanto al tiempo de ejecución, uso de memoria, etc. de foo ?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

En otras palabras, ¿sería esta una mejor opción, y si es así, por qué?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

Darius Bacon ha sugerido debajo de que las dos muestras anteriores son idénticas, ya que se puede acceder a localState desde cualquier lugar dentro del bloque. Sin embargo, el ejemplo a continuación donde foo se define fuera del bloque puede ser un caso diferente. ¿Qué piensas?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
¿Fue útil?

Solución

Cada función en Javascript es un cierre. El tiempo de ejecución para resolver el valor de una variable solo se incurre si la función hace referencia a la variable. Por ejemplo, en este ejemplo, la función y captura el valor de x, aunque x no hace referencia directamente a y:

var x = 3;
function y() eval("x");
y();
3

Otros consejos

Ambos fragmentos de código son equivalentes, porque ambos están definidos en el (mismo) entorno de la función anónima que estás creando. Creo que podrás acceder a localState desde foo de cualquier manera.

Dicho esto ... si tiene cantidades absurdas de variables en el entorno que está creando, entonces el tiempo de ejecución de foo podría verse afectado, ya que las búsquedas de variables probablemente tomarán más tiempo. Si hay toneladas de variables que ya no usa en la función que define foo , y foo tampoco las necesita, entonces foo hará que no se recojan de basura, por lo que también podría ser un problema.

Perro, espero que el orden de las declaraciones sea algo que los intérpretes de JavaScript puedan abstraer. En cualquier caso, si hay una diferencia de rendimiento, sería tan mínimo como para convertirlo en un elemento secundario para los males de la optimización prematura.

No creo que haya una sobrecarga de rendimiento, ya que el script java no usa la noción de pila de funciones. Es compatible con el alcance léxico. El mismo estado se lleva a cabo a través de llamadas de cierre. En una nota al margen, en tu ejemplo, ¡parece que no estás ejecutando ninguna declaración!

El alcance de una declaración var o function es el bloque completo en el que aparece, independientemente de dónde se encuentre la declaración en el bloque; por lo que sería sorprendente que afecte a la eficiencia.

Es decir, no debería importar si " función foo () " es antes o después de " var localState " dentro de este bloque puede importar si la función " foo () " está en este bloque o en uno de cierre (si puede ser elevado a un alcance mayor porque no usa ninguna variables locales); eso depende de los detalles de tu compilador de Javascript.

En tus ejemplos, la diferencia realmente no importará. Incluso si foo está en el ámbito global, no tendrá ningún problema.

Sin embargo, es útil tener en cuenta que si utiliza el estilo de asignar funciones a las variables para declarar sus funciones, el orden en el que se declaran puede convertirse en un gran problema.

Para una mejor idea, pruebe los siguientes dos ejemplos:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

La única diferencia entre el segundo y el primero es el estilo que usan para declarar sus funciones. El segundo genera un error de referencia.

Saludos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top