Pregunta sobre javascript, computation, loops – En JavaScript, ¿cuáles son las razones específicas por las que crear funciones dentro de un bucle puede ser un desperdicio computacional?

4

En JavaScript, ¿cuáles son las razones específicas por las que crear funciones dentro de un bucle puede ser un desperdicio computacional?

En la página 39 de JavaScript The Good Parts, Douglas Crockford afirma: "Evite crear funciones dentro de un bucle. Puede ser un desperdicio computacional". Parece que no puedo entender por qué crear funciones dentro de un bucle sería más inútil que afuera.

@amnotiam verdad, solo mencionándolo por "minuciosidad": P Esailija
@Esailija: Excepto que no debe colocar una declaración de función dentro del bloque de instrucciones del bucle (incluso si algunas implementaciones aún lo alzan). Tiene que ir antes o después del bucle. user1106925
En javascript, las funciones son objetos de primera clase, por lo que siempre crea un nuevo objeto de función cuando usa una expresión de función. Si utiliza la declaración de función (más comparable a otros idiomas), se eleva y ni siquiera se ejecuta en el bucle. Esailija
posible duplicado deError de JSlint "No hacer funciones dentro de un bucle". lleva a la pregunta sobre el propio Javascript ? (Esa discusión es realmente interesante de todos modos) fcalderan

Tu respuesta

2   la respuesta
5

Porque estas creando variasFunction Objetos en lugar de reutilizar solo uno.

Ejemplo de crear una función idéntica ...

for (var i = 0; i < 10; i++) {
    // v--creating identical function in each iteration.
    (function(j) {
        var el = document.createElement('a');
        el.onclick = function() { alert(j); };
        document.body.appendChild(el);
    })(i);
}

Ejemplo de reutilización de una función nombrada ...

for (var i = 0; i < 10; i++) {
    var el = document.createElement('a');
      // ----------v---calling a reusable function
    el.onclick = createHandler(i);
    document.body.appendChild(el);
}

function createHandler(j) {
    return function() { alert(j); };
}

Los dos ejemplos tienen el mismo resultado, pero el segundo no requiere la sobrecarga de realizar dos funciones durante el ciclo. En su lugar, crea un solo controlador.

¡Gran ejemplo, el código tiene una manera de explicar las cosas mejor que las palabras! Gracias. TheBrent
2

Crear una función puede usar muchos recursos. Como las funciones son en realidad objetos, el código tiene que crear realmente un nuevo objeto de función cada vez, no puede crearlo solo una vez y luego reutilizarlo.

La creación de una función dentro de un bucle generalmente significa que estará creando muchas funciones en lugar de crear una sola función fuera del bucle.

Por lo tanto, es solo una cuestión de no hacer algo intensivo de recursos dentro de un bucle si en su lugar puede hacerlo una vez fuera del bucle. Cuando se trata de funciones, a menudo se pueden crear fuera del bucle sin cambiar la lógica del código.

Preguntas relacionadas