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

编辑:我认为我看到的jQuery源代码是这样的:

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

我错了。 忽略这个问题。


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

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

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

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

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

jQuery源代码的最后一行是

 })(); 

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

它实际上做的是:

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

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

然而,jQuery(和$)最终因为该行而在全球范围内可用:

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

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

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

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

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

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

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

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

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

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

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

 (function() { function doSomething() { doSomethingElse(); } function doSomethingElse() { } window.doSomething = doSomething; })(); 

(虽然我通常不怎么做模块模式,但它与jQuery的工作方式类似。)

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

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

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

想象一下,你想将一个函数存储到你将要执行的var中:

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

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

 fn(arg1, arg2). 

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

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