您展示的两个代码块在执行的时间和原因上有很大的不同。它们并不相互排斥。它们的用途不同。
JavaScript module
(function($) {
// Backbone code in here
})(jQuery);
这是一个“JavaScript module”模式,使用立即调用函数实现。
此代码的目的是为您的代码提供“module化”、隐私和封装。
this 的实现是一个由调用方(jQuery)
括号立即调用的函数。将 jQuery 传入括号的目的是为全局变量提供局部作用域。这有助于减少查找$
变量的开销,并在某些情况下允许对缩小器进行更好的压缩/优化。
立即调用函数会立即执行。一旦函数定义完成,函数就会被执行。
jQuery 的“DOMReady”函数
这是 jQuery 的“DOMReady”函数的别名:http : //api.jquery.com/ready/
$(function(){
// Backbone code in here
});
当 DOM 准备好由您的 JavaScript 代码操作时,jQuery 的“DOMReady”函数就会执行。
主干代码中的module与 DOMReady
在 jQuery 的 DOMReady 函数中定义 Backbone 代码是一种糟糕的形式,并且可能会损害您的应用程序性能。在 DOM 已加载并准备好进行操作之前,不会调用此函数。这意味着在定义对象之前,您需要等待浏览器至少解析一次 DOM。
在 DOMReady 函数之外定义 Backbone 对象是一个更好的主意。在许多其他人中,我更喜欢在 JavaScript module模式中执行此操作,以便我可以为我的代码提供封装和隐私。我倾向于使用“显示module”模式(请参阅上面的第一个链接)来提供对module之外我需要的位的访问。
通过在 DOMReady 函数之外定义您的对象,并提供一些引用它们的方法,您可以让浏览器在处理您的 JavaScript 时抢占先机,从而可能加快用户体验。它还使代码更加灵活,因为您可以移动事物而不必担心在移动事物时创建更多 DOMREady 函数。
您仍然可能会使用 DOMReady 函数,即使您在其他地方定义了 Backbone 对象。原因是许多 Backbone 应用程序需要以某种方式操作 DOM。为此,您需要等到 DOM 准备就绪,因此您需要在定义后使用 DOMReady 函数来启动您的应用程序。
你可以在网上找到很多这样的例子,但这里有一个非常基本的实现,使用module和 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();
});