Los dos bloques de código que ha mostrado son dramáticamente diferentes en cuándo y por qué se ejecutan. No son exclusivos el uno del otro. No tienen el mismo propósito.
Módulos JavaScript
(function($) {
// Backbone code in here
})(jQuery);
Este es un patrón de "Módulo JavaScript", implementado con una función de invocación inmediata.
El propósito de este código es proporcionar "modularidad", privacidad y encapsulación para su código.
La implementación de esto es una función que es inmediatamente invocada por el (jQuery)paréntesis de llamada . El propósito de pasar jQuery entre paréntesis es proporcionar un alcance local a la variable global. Esto ayuda a reducir la sobrecarga de buscar el$ variable y permite una mejor compresión / optimización para los minificadores en algunos casos.
Las funciones de invocación inmediata se ejecutan, bueno, de inmediato. Tan pronto como se completa la definición de la función, la función se ejecuta.
Función "DOMReady" de jQuery
Este es un alias de la función "DOMReady" de jQuery: http://api.jquery.com/ready/
$(function(){
// Backbone code in here
});
La función "DOMReady" de jQuery se ejecuta cuando el DOM está listo para ser manipulado por su código JavaScript.
Módulos vs DOMReady en código backbone
Es una mala forma definir su código Backbone dentro de la función DOMReady de jQuery, y potencialmente perjudicial para el rendimiento de su aplicación. Esta función no se llama hasta que el DOM se ha cargado y está listo para ser manipulado. Eso significa que está esperando hasta que el navegador haya analizado el DOM al menos una vez antes de definir sus objetos.
Es una mejor idea definir sus objetos Backbone fuera de una función DOMReady. Yo, entre muchos otros, prefiero hacer esto dentro de un patrón de módulo JavaScript para poder proporcionar encapsulación y privacidad para mi código. Tiendo a usar el patrón "Módulo revelador" (ver el primer enlace arriba) para proporcionar acceso a los bits que necesito fuera de mi módulo.
Al definir sus objetos fuera de la función DOMReady y proporcionar alguna forma de referenciarlos, está permitiendo que el navegador obtenga una ventaja en el procesamiento de su JavaScript, lo que potencialmente acelera la experiencia del usuario. También hace que el código sea más flexible ya que puede mover cosas sin tener que preocuparse por crear más funciones DOMREady cuando mueva cosas.
Es probable que use una función DOMReady, incluso si define sus objetos Backbone en otro lugar. La razón es que muchas aplicaciones Backbone necesitan manipular el DOM de alguna manera. Para hacer esto, debe esperar hasta que DOM esté listo, por lo tanto, debe usar la función DOMReady para iniciar su aplicación después de que se haya definido.
Puede encontrar muchos ejemplos de esto en la web, pero aquí hay una implementación muy básica, usando tanto un Módulo como la función DOMReady:
// Define "MyApp" as a revealing module
MyApp = (function(Backbone, $){
var View = Backbone.View.extend({
// do stuff here
});
return {
init: function(){
var view = new View();
$("#some-div").html(view.render().el);
}
};
})(Backbone, jQuery);
// Run "MyApp" in DOMReady
$(function(){
MyApp.init();
});