2010-04-29 19 views
7

Es esto:jQuery y la función alcance

($.fn.myFunc = function() { 
     var Dennis = function() { /*code */ } 
     $('#Element').click(Dennis); 
    })(); 

equivalente a:

($.fn.myFunc = function() { 
     $('#Element').click(function() { /*code */ }); 
    })(); 

Si no es así, por favor alguien puede explicar la diferencia, y sugerir la mejor ruta a tomar, tanto para el rendimiento, la reutilización función y claridad de lectura.

Gracias!

Respuesta

8

La única diferencia es que el primero proporciona una referencia a la función.

Por lo tanto, usted puede hacer esto:

($.fn.myFunc = function() { 
    var Dennis = function() { /*code */ } 
    $('#Element').click(Dennis); 

    Dennis(); 
})(); 

Lo cual no es posible con este último.

Esto puede ser útil. Por ejemplo, es posible que desee que el clic manipule una parte de la página, pero también quiero hacerlo en la carga de la página. Podría hacerlo con:

$(function(){ 

    var manipulateSomething = function() { 
     // do stuff 
    }; 

    // do it on click 
    $("#Element").click(manipulateSomething); 

    // and do it right now (document.ready) 
    manipulateSomething(); 

}); 

(Aparte:. No llamarían $("#Element").click(); de lograr esto a menos que quería que todos los manipuladores clic en #Element para disparar)

0

Es lo mismo. Normalmente voy con el segundo, la ruta de la función anónima.

La única razón para nombrar su función en línea, como en el primer ejemplo, es si necesita volver a utilizarla, tal vez más adelante en la función, o si desea dejar muy clara cuál es la función. Pero incluso en ese caso, si la función Dennis fuera a tomar argumentos, necesitaría todavía necesitar usar un nuevo alcance de función en su llamada para pasar esos argumentos.

Los cierres anónimos de funciones son el patrón más robusto.

0

el segundo uno mira más bonita :) pero es el mismo

0

Sí, la función anónima es más clara, sin agregar funciones nombradas superfluas que se llaman instantáneamente.

Si realmente quiere poner un nombre allí, can. Los nombres generalmente solo se ponen ahí para hacerlos recursivos.