为什么定义一个匿名函数并将jQuery作为parameter passing给它?

我正在通过backbone.js截屏video的优秀peepcode演示代码。 其中,骨干代码全部包含在传递jQuery对象的匿名函数中:

(function($) { // Backbone code in here })(jQuery); 

在我自己的主干代码中,我已经将所有的代码包装在了jQuery DOM'ready'事件中:

 $(function(){ // Backbone code in here }); 

第一种方法的优点是什么? 这样做创build一个匿名函数,然后立即执行jQuery对象作为函数parameter passing,有效地确保$是jQuery对象。 这是唯一的一点 – 保证jQuery绑定到'$'还是有其他原因这样做?

你所显示的两段代码在执行时间和执行方式上有很大的不同。 它们不是互相排斥的。 他们没有达到相同的目的。

JavaScript模块

 (function($) { // Backbone code in here })(jQuery); 

这是一个“JavaScript模块”模式,用立即调用function实现。

此代码的目的是为您的代码提供“模块化”,隐私和封装。

这个实现是一个由调用(jQuery)括号立即调用的函数。 将jQuery传递给括号的目的是为全局variables提供本地范围。 这有助于减less查找$variables的开销,并且在某些情况下允许缩小器的更好的压缩/优化。

立即调用函数立即执行。 一旦函数定义完成,函数就会被执行。

jQuery的“DOMReady”function

这是jQuery的“DOMReady”函数的别名: http : //api.jquery.com/ready/

 $(function(){ // Backbone code in here }); 

jQuery的“DOMReady”函数在DOM准备被JavaScript代码处理时执行。

模块与DOMReady在骨干代码

在jQuery的DOMReady函数中定义Backbone代码是一种糟糕的forms,并且可能会破坏应用程序的性能。 直到DOM已经加载并准备好被操作,该函数才会被调用。 这意味着在等待浏览器至lessparsingDOM一次,然后再定义对象。

在DOMReady函数之外定义Backbone对象是个好主意。 我和其他人一样,更喜欢在JavaScript模块模式中这样做,这样我就可以为我的代码提供封装和隐私。 我倾向于使用“显示模块”模式(请参阅上面的第一个链接)来提供我在模块外需要的位。

通过在DOMReady函数之外定义对象,并提供一些方法来引用它们,您可以让浏览器在处理JavaScript时获得先机,从而加速用户体验。 它还使代码更加灵活,因为您可以移动事物,而无需担心在移动事物时创build更多的DOMREady函数。

即使你在其他地方定义了你的Backbone对象,你也可能会使用DOMReady函数。 原因是许多Backbone应用程序需要以某种方式操纵DOM。 为此,您需要等待DOM准备就绪,因此您需要使用DOMReady函数在应用程序定义后启动它。

你可以在网上find很多这样的例子,但是这里有一个非常基本的实现,同时使用一个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(); }); 

作为一个小副作用,将$作为一个参数发送给一个匿名函数会使该函数成为$ local,如果这个$函数被调用的话,这个函数会带来很小的性能影响。 这是因为JavaScript首先在本地范围内searchvariables,然后一直遍历到窗口范围(其中$通常在此处)。

它确保即使使用$.noConflict() ,也可以在该闭包中始终使用$

没有这个闭包,你应该使用jQuery而不是$整个时间。

这是为了避免$variables的潜在冲突。 如果别的东西定义了一个名为$的variables,你的插件可能会使用错误的定义

有关更多详细信息,请参阅http://docs.jquery.com/Plugins/Authoring#Getting_Started

同时使用。

自我调用函数,在其中传递jQuery来防止库冲突,并确保jQuery可用,就像你期望的$。

和.ready()快捷方法只需在DOM加载后运行javascript即可:

 (function($) { $(function(){ //add code here that needs to wait for page to be loaded }); //and rest of code here })(jQuery);