在YUI库的例子中,你可以找到这个结构的很多用法:
(function() {
var Dom = YAHOO.util.Dom,
Event = YAHOO.util.Event,
layout = null,
...
})();
我认为最后两个括号是在声明之后执行函数的。
... 但是前面围绕函数声明的圆括号呢?
我认为这是一个范围问题;这是为了将变量隐藏到外部函数和全局对象中。是吗?更一般地说,这些括号的机制是什么?
在YUI库的例子中,你可以找到这个结构的很多用法:
(function() {
var Dom = YAHOO.util.Dom,
Event = YAHOO.util.Event,
layout = null,
...
})();
我认为最后两个括号是在声明之后执行函数的。
... 但是前面围绕函数声明的圆括号呢?
我认为这是一个范围问题;这是为了将变量隐藏到外部函数和全局对象中。是吗?更一般地说,这些括号的机制是什么?
当前回答
我想继续安迪·休谟和其他人说过的话
围绕匿名函数的“()”是ECMA规范第11.1.6节定义的“分组操作符”:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf。
从文件中逐字逐句摘录:
11.1.6分组操作符
结果的PrimaryExpression:(表达式)计算如下:
返回表达式的求值结果。这可能是Reference类型。
在这种情况下,函数被视为表达式。
其他回答
...但是之前所有函数声明周围的圆括号呢?
具体来说,它使JavaScript解释'function(){…构造为内联匿名函数表达式。如果省略括号:
function() {
alert('hello');
}();
你会得到一个语法错误,因为JS解析器会看到'function'关键字,并假设你正在开始一个这样的函数语句:
function doSomething() {
}
...你不能有一个没有函数名的函数语句。
函数表达式和函数语句是两种不同的结构,以非常不同的方式处理。不幸的是,语法几乎完全相同,所以这不仅让程序员感到困惑,甚至解析器也难以分辨您的意思!
它是一个自动执行的匿名函数。第一组圆括号包含要执行的表达式,第二组圆括号执行这些表达式。
当试图从父名称空间隐藏变量时,它是一个有用的构造。函数中的所有代码都包含在函数的私有作用域中,这意味着它根本不能从函数外部访问,这使得它真正是私有的。
See:
http://en.wikipedia.org/wiki/Closure_%28computer_science%29
http://peter.michaux.ca/articles/javascript-namespacing
关于这个问题的几点考虑:
括号: 浏览器(引擎/解析器)将关键字函数与 [可选名称]([可选参数]){…code…} 因此,在function(){}()这样的表达式中,最后一个括号没有意义。 现在想想 名称= function () {};名称()?
是的,第一对圆括号迫使匿名函数转换为变量(存储表达式),而第二对圆括号启动求值/执行,因此(function(){})()是有意义的。
效用:? 用于在加载时执行一些代码,并将使用的变量与页面的其余部分隔离开来,特别是当名称冲突是可能的; 将eval("string")替换为 (新功能(“字符串”))() =?: "这样的操作符: 结果= exp_to_test ?(函数(){…Long_code…})():(function(){…})();
我想继续安迪·休谟和其他人说过的话
围绕匿名函数的“()”是ECMA规范第11.1.6节定义的“分组操作符”:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf。
从文件中逐字逐句摘录:
11.1.6分组操作符
结果的PrimaryExpression:(表达式)计算如下:
返回表达式的求值结果。这可能是Reference类型。
在这种情况下,函数被视为表达式。
第一个括号表示运算的顺序。围绕函数定义的括号集的“结果”是函数本身,实际上,第二组括号执行该函数。
至于为什么它是有用的,我不是一个足够的JavaScript向导有任何想法。: P