jQuery问题:这究竟是什么意思?

时间:2011-03-14 22:58:46

标签: javascript jquery

(function($, window, undefined){
  ... jquery code... 
})(jQuery, window);

这究竟是什么意思?它是否也意味着$(document).ready()?或者只是两件不同的事情?

5 个答案:

答案 0 :(得分:37)

已经有两个答案,但这是我对代码缺失结束的猜测:

(function ($, window, undefined) {
  // ... jquery code... 
})(jQuery, window);

注意:预计会有三个参数,但会提供两个

它基本上是做什么的:

  1. 在花括号内部给出一个私有范围,因此在
  2. 之外看不到任何内部声明的var
  3. 制作$的私人jQuery快捷方式,而不依赖于全局设置的此快捷方式(例如。jQuery.noconflict()可能已被调用,但这仍然有用)
  4. 创建一个词法窗口变量,意味着更快地查找全局变量
  5. 确保在花括号之间的范围内确实undefined未定义,即使有人在全局范围内编写了类似undefined = "now it's defined";的内容,因为undefined实际上可以重新定义(这这是语言的错误。)
  6. 此模式称为立即调用函数,或简称立即函数,或自调用匿名函数或其他一些名称。基本思路是:

    (function (x, y) {
        // ...
    })(1, 2);
    

    或:

    (function (x, y) {
        // ...
    }(1, 2));
    

    表示与:

    相同
    function myFunction (x, y) {
        // ...
    }
    myFunction(1, 2);
    

    但不需要为您的函数指定任何名称并污染命名空间。

    回到你的问题,这并不意味着$(document).ready()或类似的东西,但这意味着你可以使用$(document).ready() 内的代替{{1}即使jQuery(document).ready()快捷方式在外面不可用。

    这个例子实际上可以更好地解释它,即使它没有在任何地方使用:

    $

    现在代替(function (JQ, window, undefined) { JQ(document).ready(function () { // this is run when document is ready }); })(jQuery, window); ,您可以将{jQuery调用为$并使用JQ代替JQ(document).ready() - 它可能看起来不太有用但它会显示当您拥有时会发生什么这样的代码。

    作为旁注,我可以补充说,由于这种模式,你实际上并不需要语言中的变量声明,而只需要函数参数。而不是:

    $(document).ready()

    你可以使用:

    var x = 10;
    alert(x * x * x);
    

    确实是这样的函数:

    (function (x) {
        alert(x * x * x);
    })(10);
    

    完全等同于:

    function square (x) {
        // some code ...
        var result = x * x;
        return result;
    }
    

    因为JavaScript中的提升机制会使function square (x, result) { // some code ... result = x * x; return result; } 变量在两种情况下(在result部分中)的声明和赋值之前可用(但未定义)。这通常是混乱的根源,但实际上非常有趣且极其强大。

    有关此主题的更多信息,请参阅我最近更新的其他answer to the question: Help understanding JavaScript global abatement techniques

答案 1 :(得分:3)

(function($, window, undefined){
  ... jquery code... 
})();

不同
$(document).ready() 

保罗爱尔兰人在1点30分在10 Things I Learned from the jQuery Source上有一段很好的视频,他谈到了jquery源的自动执行匿名函数以及论证的含义

答案 2 :(得分:1)

我猜测代码实际上是这样的:

(function($, window, undefined){
  ... jquery code... 
})(jQuery, window);

请注意最后的括号。

如果是这种情况,那么这里发生的是self-executing anonymous function.这样做的一点是,在该匿名函数内定义的任何局部变量或函数都不会污染全局命名空间。

答案 3 :(得分:1)

就像它并没有多大意义(此外还缺少结束))。你可能正在看的是类似的

(function($, window){
    // code
} )($, window);

这会将代码置于新范围内,因此您可以定义变量而不会弄乱外部范围。

它还允许您将不同的内容传递给函数,而无需更改代码。例如,如果您使用不同的JavaScript框架,并且$未绑定到jQuery,则可以为jQuery传递替代变量,而您仍在使用$在内部引用jQuery 。与此类似,您也可以传递不同的窗口实例(例如,从弹出窗口)。

答案 4 :(得分:0)

@rsp对这个具体问题有很好的答案。

有关此模式的一般背景,请参阅http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth