javascript中带有jquery的匿名函数

javascript中带有jquery的匿名函数,javascript,jquery,Javascript,Jquery,之间的区别是什么 我知道这里全局jQuery作为$to函数传递 (function($){ })(jQuery); 这个呢 $(function(){ })(); 第二个不是通用模式(它将抛出类型错误),除非您错误地包含了调用括号: (function($){ // Normal IIFE that happens to pass jQuery in as an argument })(jQuery); $(function(){ // Shorthand DOM-re


之间的区别是什么 我知道这里全局jQuery作为$to函数传递

(function($){

})(jQuery);
这个呢

$(function(){

})();

第二个不是通用模式(它将抛出类型错误),除非您错误地包含了调用括号:

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

$(function(){
    // Shorthand DOM-ready event handler
}); // <-- Remove the invoking parentheses
(函数($){
//作为参数传入jQuery的正常IIFE
})(jQuery);
$(函数(){
//速记DOM就绪事件处理程序
}); // 
它定义了一个函数,然后立即调用,并将JQuery对象作为参数传入。$是对JQuery的引用,您可以在函数中使用它。这相当于:

var Test = function ($){};
Test(jQuery);
这是:

$(function (){

});
是对JQuery的调用,传入一个函数,在文档加载完成后应该执行该函数。

$(function(){ //这里有主干代码 }); :

这是一个函数的别名,当DOM准备好被JavaScript代码操纵时执行。这允许您编写需要DOM的代码,同时知道DOM是可用的,可以被应用程序读取、写入或修改

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

(函数($){ //这里有主干代码 })(jQuery);:

这是一个立即调用函数表达式(FKA“匿名函数”、“自调用函数”等)

这个函数的实现是一个由调用(jQuery)括号立即调用的函数。将jQuery传入括号的目的是为全局变量提供局部作用域。这有助于减少查找$variable的开销,并在某些情况下允许更好地压缩/优化minifier

在本例中,函数被用作JavaScript“模块”模式。大多数浏览器中当前实现的JavaScript版本中的模块与函数不同,不是特定的结构。相反,它们是一种实现模式,使用一个立即调用的函数来提供相关功能的“模块”的范围和隐私。模块通过从模块的函数返回一个对象来公开一个公共API——“显示模块”模式是很常见的。但有时,模块是完全自包含的,不提供任何外部方法来调用

这只是DOM就绪事件处理程序的简写,相当于:

$(document).ready(function(){
    // execution when DOM is loaded...
});
现在来谈谈这个问题:

(function($){
    // code here
})(jQuery);
这段代码不会在DOM就绪上执行,而是直接执行。将jQuery作为参数传递到函数中的好处是避免与美元符号(
$
)的使用发生冲突,因为多个库将其用作速记引用。函数中的所有内容都可以安全地使用
$
,因为这是作为
jQuery
的引用传入的

阅读有关
$
符号冲突的更多信息:

如果您将这两个代码段组合在一起,您将得到一个漂亮而可靠的设置:

// $ 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解析器遇到它时,第一个剪贴集将执行“function($){…}”,在其中创建一种私有上下文,其中$argument var将指向jQuery,因为它是作为参数(jQuery)传递的(如果您希望避免与先前声明的$var发生任何冲突,而该$var将引用jQuery对象以外的其他对象,这将非常有用)

第二个类似于JQuery.ready函数调用,但有语法错误。实际上,有两种方法可以写出它

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

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

$(函数(){})()
不等于DOM Ready,必须在end@muneebShabbir说得好。不确定如果添加这些括号会发生什么。我来看看JSFIDLE。
// $ 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);
$(document).ready(function(){
     /* DOM has loaded */
});

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