2010-12-10 10 views
6

Empecé a usar este patrón en JavaScript. No estoy seguro de si lo leí específicamente, o si lo conjuré un día.Empecé a usar este patrón de JavaScript. ¿Hay algo malo con eso?

El formato es ...

var name = (function() { 

    var init = function() { 
     // Init something 
     $('a').click(show); 
    }; 

    var show = function() { 
     // Show something 
    }; 

    $(init); 

})(); 

Y aquí es un ejemplo del mundo real ...

var contactForm = (function() { 
    var init = function() { 

     if (! $('body').hasClass('contact')) { 
      return; 
     }; 

     var form = $('.contact #content form'); 

     form.validate({ 
       rules: { 
        'full-name': { 
         required: true 
        },  
        'email': { 
         required: true, 
         email: true 
        },  
       }, 
       messages: { 
        'email': { 
         email: 'Please make sure this email is valid.' 
        } 

      } 
      }); 

    }; 

    $(init); 

})(); 

¿Hay algo malo en esto?

+0

¿Por qué usar las variables (* name, contactForm *) ya que no devuelve nada de la función (* y la llama inmediatamente *)? ¿Por qué no saltear esa parte por completo? o es como un marcador para ti? –

+0

@Gaby Solo para que pueda ver claramente lo que hace cada función, y ayuda con la depuración. Supongo que podrían ser comentarios, pero luego mi rastro de pila mostraría algunas funciones sin nombre. – alex

+2

lo tengo. Concepto ingenioso –

Respuesta

0

No. De hecho, hago casi lo mismo, pero ¿por qué llamas a $(init) en lugar de a init()?

+0

Porque estoy usando jQuery, y quiero que se active en DOM listo. – alex

+0

Ah. Estoy acostumbrado a hacer las cosas un poco diferente y asumí que estarías envolviendo varios bloques dentro de una única llamada '$ (función() {})'. Me avergüenza. Continuar. :) – simshaun

1

Ningún YUI realmente llama a esto el patrón del Módulo y lo usa en gran parte de su código.

Incluso puede hacer lo siguiente dentro de la función anónima.

name = new init(); 
0

Parece un plugin jQuery escrito como un IIFE (Expresión de función invocada inmediatamente). Realmente no necesita var name = (variable global adicional) y pasar el objeto jQuery es la mejor práctica en caso de $.noConflict(). Consulte la charla de Ben Alman jquery-plugin-authoring para obtener esta y otra información interesante.

(function($) { 

    var init = function() { 
     // Init something 
     $('a').click(show); 
    }; 

    var show = function() { 
     // Show something 
    }; 

    $(init); 

})(jQuery); 
Cuestiones relacionadas