Os dois blocos de código que você mostrou são dramaticamente diferentes em quando e por que são executados. Eles não são exclusivos um do outro. Eles não têm o mesmo propósito.
Módulos JavaScript
(function($) {
// Backbone code in here
})(jQuery);
Este é um padrão de "Módulo JavaScript", implementado com uma função de chamada imediata.
O objetivo deste código é fornecer "modularidade", privacidade e encapsulamento para o seu código.
A implementação disso é uma função que é imediatamente invocada pelo (jQuery)
parêntese de chamada . O objetivo de passar jQuery para o parêntese é fornecer escopo local para a variável global. Isso ajuda a reduzir a quantidade de sobrecarga de pesquisa da $
variável e permite uma melhor compactação / otimização para minificadores em alguns casos.
As funções de invocação imediata são executadas, bem, imediatamente. Assim que a definição da função for concluída, a função será executada.
Função "DOMReady" do jQuery
Este é um alias para a função "DOMReady" do jQuery: http://api.jquery.com/ready/
$(function(){
// Backbone code in here
});
A função "DOMReady" do jQuery é executada quando o DOM está pronto para ser manipulado por seu código JavaScript.
Módulos vs DOMReady no código de backbone
É péssimo definir seu código de Backbone dentro da função DOMReady do jQuery, e potencialmente prejudicial ao desempenho de seu aplicativo. Esta função não é chamada até que o DOM seja carregado e esteja pronto para ser manipulado. Isso significa que você está esperando até que o navegador tenha analisado o DOM pelo menos uma vez antes de definir seus objetos.
É uma ideia melhor definir seus objetos Backbone fora de uma função DOMReady. Eu, entre muitos outros, prefiro fazer isso dentro de um padrão de módulo JavaScript para poder fornecer encapsulamento e privacidade para meu código. Costumo usar o padrão "Módulo revelador" (consulte o primeiro link acima) para fornecer acesso aos bits que preciso fora do meu módulo.
Ao definir seus objetos fora da função DOMReady e fornecer alguma maneira de referenciá-los, você está permitindo que o navegador obtenha uma vantagem no processamento de seu JavaScript, potencialmente acelerando a experiência do usuário. Isso também torna o código mais flexível, pois você pode mover coisas sem ter que se preocupar em criar mais funções DOMREady ao mover as coisas.
Você provavelmente vai usar uma função DOMReady, ainda, mesmo se definir seus objetos de Backbone em outro lugar. O motivo é que muitos aplicativos de Backbone precisam manipular o DOM de alguma maneira. Para fazer isso, você precisa esperar até que o DOM esteja pronto, portanto, você precisa usar a função DOMReady para iniciar seu aplicativo após ele ter sido definido.
Você pode encontrar muitos exemplos disso na web, mas aqui está uma implementação muito básica, usando um módulo e a função 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();
});