2013-10-03 40 views

回答

0
(function ($) 

})(jQuery); 

它定义了一个函数,然后立即调用,并将JQuery对象作为参数传入。 $是JQuery的引用,您可以在该函数内部使用它。这是相同的:

var Test = function ($){}; 
Test(jQuery); 

这:

$(function(){ 

}); 

是jQuery的调用,通过其一旦文档加载完毕后应执行的功能。

3

第二个是不是一个普通的模式(它会抛出一个类型错误),除非你错误地包含了引用括号:

(function($){ 
    // Normal IIFE that happens to pass jQuery in as an argument 
})(jQuery); 

$(function(){ 
    // Shorthand DOM-ready event handler 
}); // <-- Remove the invoking parentheses 
1

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

这是jQuery’s “DOMReady”函数的别名,当DOM准备好被JavaScript代码处理时执行该函数。这使您可以编写需要DOM的代码,并知道DOM可用并准备好被应用程序读取,写入或修改。

虽然这不是一个模块。这只是一个传递给DOMReady别名的回调函数。在这种情况下,模块和回调之间的主要区别在于jQuery等待DOM准备就绪,然后在适当的时候调用回调函数 - 所有这些都来自jQuery的上下文 - 而模块模式或立即调用函数在定义后立即执行。在上面的例子中,模块接收jQuery作为参数,但这与使用jQuery的DOMReady事件不同,因为模块函数被调用,立即传入jQuery作为参数。它不会等待DOM准备就绪。只要函数被解析,它就会执行。

(函数($){// 骨干在代码在这里 })(jQuery的);:

这是一个紧调用函数表达式(FKA“匿名功能”,“自我呼叫功能“等)。

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

在这种情况下,该函数被用作JavaScript“模块”模式。在大多数浏览器中,当前实现的JavaScript版本中的模块并不是特定的函数结构。相反,它们是一种实现模式,它使用立即调用功能来提供围绕相关功能“模块”的范围和隐私。模块通常会公开一个公共API - “揭示模块”模式 - 通过从模块函数中返回一个对象。但有时候,模块完全独立,不提供任何外部方法来调用。

check this

1
$(function(){ 

}); 

这只是对DOM准备的事件处理程序,即相当于速记:在

$(document).ready(function(){ 
    // execution when DOM is loaded... 
}); 

我们这样的:

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

这段代码不会在DOM准备好时执行,但会直接执行。将jQuery作为参数传入函数的好处是避免与美元符号($)的使用冲突,因为多个库将它用作速记引用。函数内部的所有内容都可以安全使用$,因为这是作为参考jQuery传入的。

了解更多关于在$符号冲突:jQuery noConflict

如果将二者结合起来的代码片段,你会得到一个很好的和坚实的设置:

// $ reference is unsafe here in the global scope if you use multiple libraries 

(function($){ 
    // $ is a reference to jQuery here, passed in as argument 

    $(function(){ 
     // executed on dom-ready 
    }); 

})(jQuery); 

PS:在JavaScript由于function能既是一种陈述,也是一种表达,取决于上下文,大多数人在其周围添加额外的括号以强制它成为表达式。

+1

'$(函数(){ })(); '不等于DOM-Ready,你必须在末尾删除空括号 – muneebShabbir

+1

@muneebShabbir好点。不知道如果添加这些括号会发生什么情况。我会看看jsFiddle。 –

1

当js解析器遇到它时,第一个snipset将执行“function($){...}”,在其中创建一种私有上下文,其中$ argument var将指向jQuery,因为它作为参数传递“ (jQuery)“(如果你想避免与先前声明的$ var相冲突,这会引用除jQuery对象之外的其他东西)

第二个看起来像JQuery.ready函数调用,但带有语法错误。有双向的actualy写它

$(document).ready(function(){ 
    /* DOM has loaded */ 
}); 

$(function(){ 
    /* DOM has loaded */ 
});