Die beiden von Ihnen gezeigten Codeblöcke unterscheiden sich erheblich darin, wann und warum sie ausgeführt werden. Sie schließen sich nicht aus. Sie dienen nicht dem gleichen Zweck.
JavaScript-Module
(function($) {
// Backbone code in here
})(jQuery);
Dies ist ein "JavaScript-Modul" -Muster, das mit einer sofort aufrufenden Funktion implementiert wird.
Der Zweck dieses Codes besteht darin, "Modularität", Datenschutz und Kapselung für Ihren Code bereitzustellen.
Die Implementierung ist eine Funktion, die sofort von der aufrufenden (jQuery)Klammer aufgerufen wird . Der Zweck der Übergabe von jQuery an die Klammer besteht darin, der globalen Variablen einen lokalen Gültigkeitsbereich bereitzustellen. Dies trägt dazu bei, den Aufwand $für das Nachschlagen der Variablen zu verringern , und ermöglicht in einigen Fällen eine bessere Komprimierung / Optimierung für Minifizierer.
Sofort aufrufende Funktionen werden sofort ausgeführt. Sobald die Funktionsdefinition abgeschlossen ist, wird die Funktion ausgeführt.
jQuerys "DOMReady" -Funktion
Dies ist ein Alias für die "DOMReady" -Funktion von jQuery: http://api.jquery.com/ready/
$(function(){
// Backbone code in here
});
Die "DOMReady" -Funktion von jQuery wird ausgeführt, wenn das DOM bereit ist, von Ihrem JavaScript-Code bearbeitet zu werden.
Module vs DOMReady im Backbone-Code
Es ist eine schlechte Form, Ihren Backbone-Code innerhalb der DOMReady-Funktion von jQuery zu definieren, was möglicherweise die Leistung Ihrer Anwendung beeinträchtigt. Diese Funktion wird erst aufgerufen, wenn das DOM geladen wurde und zur Bearbeitung bereit ist. Das heißt, Sie warten mindestens einmal, bis der Browser das DOM analysiert hat, bevor Sie Ihre Objekte definieren.
Es ist besser, Ihre Backbone-Objekte außerhalb einer DOMReady-Funktion zu definieren. Ich bevorzuge es unter anderem, dies innerhalb eines JavaScript-Modulmusters zu tun, damit ich meinen Code kapseln und schützen kann. Ich verwende normalerweise das Muster "Revealing Module" (siehe den ersten Link oben), um Zugriff auf die Bits zu erhalten, die ich außerhalb meines Moduls benötige.
Indem Sie Ihre Objekte außerhalb der DOMReady-Funktion definieren und eine Möglichkeit bieten, auf sie zu verweisen, können Sie dem Browser einen Vorsprung bei der Verarbeitung Ihres JavaScript verschaffen, was möglicherweise die Benutzererfahrung beschleunigt. Es macht den Code auch flexibler, da Sie Dinge verschieben können, ohne sich darum kümmern zu müssen, mehr DOMREady-Funktionen zu erstellen, wenn Sie Dinge verschieben.
Sie werden wahrscheinlich trotzdem eine DOMReady-Funktion verwenden, selbst wenn Sie Ihre Backbone-Objekte an einer anderen Stelle definieren. Der Grund ist, dass viele Backbone-Apps das DOM auf irgendeine Weise manipulieren müssen. Dazu müssen Sie warten, bis das DOM bereit ist. Daher müssen Sie die DOMReady-Funktion verwenden, um Ihre Anwendung zu starten, nachdem sie definiert wurde.
Sie können viele Beispiele dafür im Internet finden, aber hier ist eine sehr grundlegende Implementierung, die sowohl ein Modul als auch die DOMReady-Funktion verwendet:
// 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();
});