me encontré con el siguiente patrón cuando se mira a través del código fuente SlickGrid:¿Cuál es el motivo de este patrón de invocación inmediata de JavaScript?
(function ($) {
var SlickEditor = {
TextCellEditor: function (args) {
...
},
LongTextCellEditor: function (args) {
...
}
};
$.extend(window, SlickEditor);
})(jQuery);
Si entiendo esto correctamente, se está utilizando la invocación inmediata para definir varios objetos de función y luego unirlos en el espacio de nombres global.
Así que podría definir mis funciones globalmente así y tendría el mismo efecto, ¿no?
function TextCellEditor (args) {
...
}
function LongTextCellEditor (args) {
...
}
La única diferencia que puedo ver es que en la primera versión, puedo usar la taquigrafía $
para referirse al objeto jQuery
. Aparte de eso, el resultado sería idéntico en ambos casos.
Me gustaría saber si me falta algo. Tal vez hay otra buena razón para hacer las cosas de esta manera?
ACTUALIZACIÓN: Tenga en cuenta que el uso de este patrón de invocación inmediata permite el uso de variables privadas declaradas en la función anónima. Pero no hay ninguna variable declarada en este caso y las funciones se están inyectando en el alcance global de todos modos. Así que aún me gustaría saber si hay alguna diferencia real.
Algunas respuestas señalaron que hacer referencia a variables locales es mucho más rápido que hacer referencia a variables globales. ¿Esto sigue siendo cierto si hago referencia al $
desde el constructor TextCellEditor()
? $
no es realmente local en TextCellEditor()
ya que está definido en el ámbito de la función anónima externa.
Todos los comentarios apreciados.
... El ejemplo que se muestra inyecta una sola variable en el alcance global. Usted inyecta múltiples funciones en el alcance global. Hay una enorme diferencia entre una variable global y muchas variables globales – Raynos
@Raynos: ambos ejemplos inyectan las mismas funciones en el alcance global. la llamada '$ .extend()' amplía el objeto de ventana con todas las propiedades de 'SlickEditor' (en este caso, las dos funciones de constructor). Ese es el punto de mi pregunta: ¿cuál es la diferencia? – njr101
oh, espera, no me di cuenta de que el autor de SlickEditor era un idiota e inyectó todas las funciones en el alcance global. Es un patrón anti, ambos ejemplos de código son malas prácticas. – Raynos