为什么定义一个匿名函数并将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实现。
- http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript
- http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
此代码的目的是为您的代码提供“模块化”,隐私和封装。
这个实现是一个由调用(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);