Javascript:为什么jQuery这样做:(function(){...});,它是如何工作的?

时间:2009-12-17 23:21:54

标签: javascript jquery class-design

编辑:我的想法 我看到的jQuery源代码做了类似的事情:

(function(){
    var bunchOfVariables = 7;
    jQuery = " ....."; 
    //....
});

我错了。忽略这个问题。


我不明白那是做什么的。有人可以解释一下吗?

这是jQuery-1.3.2.js中的第一行。

它似乎定义了一个匿名函数,而不是执行它。功能在哪里?怎么运行?

如果我在测试脚本中使用这样的代码,它永远不会被调用。另一方面,如果我用open-close paren跟随它,那么它会被调用:

// never gets called
(function(){
    say("hello");
});
// gets called
(function(){
    say("buon giorno");
})();

8 个答案:

答案 0 :(得分:7)

jQuery源代码的最后一行是

})();

括号表示正在调用该函数。

答案 1 :(得分:4)

它实际做的是:

(function(){
    var bunchOfVariables = 7;
    jQuery = window.jQuery = window.$ = ...
    //....
})();

注意最后的'()',它运行整个代码块。这样做的原因是为了使所有那些'bunchOfVariables'不会在'global'(读取:window)范围内结束。

然而,由于以下行,jQuery(和$)最终可用于全局:

jQuery = window.jQuery = window.$ = ...

请记住,在DOM世界中,“全局”意味着“窗口的成员变量”。

答案 2 :(得分:2)

这是一个避免泄漏全局符号的闭包。您定义一个函数并立即执行它。

(function(){
  // some code
})();

在调用jQuery.noConflict()的情况下,此模式的常见版本将'$'符号显式绑定到jQuery:

(function($){
  // some code here, '$' is bound to jQuery
})(jQuery);

答案 3 :(得分:2)

(function() { /* ... */ })();

这种模式通常被称为“自执行匿名函数”。它定义了一个新的匿名函数(即function() { /* ... */ }部分)并立即执行它(最后是())。函数声明周围的额外括号并非绝对必要,但有助于使代码更清晰。

现在为什么有人想要这样做? JavaScript中的每个函数都有自己的范围。在其中声明的任何变量或函数都是函数的本地变量或函数,只能在其中访问。所以,假设您正在编写一个jQuery插件。也许你的插件需要很多变量和内部方法。如果在自动执行的匿名函数中声明所有这些,则可以避免使用所有内部对象污染全局范围。

答案 4 :(得分:1)

我想你可能弄错了。 jQuery的第一行启动了一个自动执行的匿名函数。你确定你的牙箍不正确吗?

答案 5 :(得分:1)

jQuery 1.3.2(当前版本)沿着这些行定义了一个匿名函数,但是 执行它;我怀疑你被发布副本中的某些异常缩进误导了。

匿名函数的要点是提供范围。这被称为“模块模式”。这是一个简化的例子

(function() {

    function doSomething() {
        doSomethingElse();
    }

    function doSomethingElse() {
    }

    window.doSomething = doSomething;
})();

(虽然通常不会如何处理模块模式,但它与jQuery的工作方式类似。)

现在有一个“公共”符号(doSomething,它是window的一个属性),它引用doSomething函数。 doSomethingElse功能可以从doSomething访问,但可以从其他地方访问。例如,它是私人范围的。

答案 6 :(得分:0)

(function(){
var bunchOfVariables = 7;
jQuery = " ....."; 
//....
});

实际上是创建一个新的匿名函数,不带参数,其中包含一些变量。但是你只是创建一个不调用函数本身的实例。

想象一下,您希望将函数存储到您将执行的var中:

var fn=function(parameter1, parameter2){..}

fn现在持有匿名函数的一个实例,要调用它你必须要做

fn(arg1, arg2).

因此,在你的开放式关闭中,你只是在调用函数,但没有任何参数。

答案 7 :(得分:0)

(function() { /* ... */ })不是“自动执行的匿名函数”,()不仅仅是“代码的外观”,它们执行函数......

相关问题