编辑:我的想法 我看到的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");
})();
答案 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() { /* ... */ })
不是“自动执行的匿名函数”,()不仅仅是“代码的外观”,它们执行函数......