的区别是什么
之间在这里,我知道全球jQuery是为$到函数传递,匿名函数在JavaScript中使用jQuery
(function($){
})(jQuery);
而这一次
$(function(){
})();
的区别是什么
之间在这里,我知道全球jQuery是为$到函数传递,匿名函数在JavaScript中使用jQuery
(function($){
})(jQuery);
而这一次
$(function(){
})();
(function ($)
})(jQuery);
它定义了一个函数,然后立即调用,并将JQuery对象作为参数传入。 $是JQuery的引用,您可以在该函数内部使用它。这是相同的:
var Test = function ($){};
Test(jQuery);
这:
$(function(){
});
是jQuery的调用,通过其一旦文档加载完毕后应执行的功能。
第二个是不是一个普通的模式(它会抛出一个类型错误),除非你错误地包含了引用括号:
(function($){
// Normal IIFE that happens to pass jQuery in as an argument
})(jQuery);
$(function(){
// Shorthand DOM-ready event handler
}); // <-- Remove the invoking parentheses
$(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 - “揭示模块”模式 - 通过从模块函数中返回一个对象。但有时候,模块完全独立,不提供任何外部方法来调用。
$(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
能既是一种陈述,也是一种表达,取决于上下文,大多数人在其周围添加额外的括号以强制它成为表达式。
当js解析器遇到它时,第一个snipset将执行“function($){...}”,在其中创建一种私有上下文,其中$ argument var将指向jQuery,因为它作为参数传递“ (jQuery)“(如果你想避免与先前声明的$ var相冲突,这会引用除jQuery对象之外的其他东西)
第二个看起来像JQuery.ready函数调用,但带有语法错误。有双向的actualy写它
$(document).ready(function(){
/* DOM has loaded */
});
$(function(){
/* DOM has loaded */
});
'$(函数(){ })(); '不等于DOM-Ready,你必须在末尾删除空括号 – muneebShabbir
@muneebShabbir好点。不知道如果添加这些括号会发生什么情况。我会看看jsFiddle。 –