可能重复:
What do parentheses surrounding a JavaScript object/function/class declaration mean?
如果使用以下JS中圆括号的含义是什么:
<script>
(
function foo(){ alert("Hello world!")}()
)
</script>
它按预期工作并显示“Hello world!”。但是,如果我拉下括号
<script>
function foo(){ alert("Hello world!")}()
</script>
Chrome控制台会生成错误“Uncaught SyntaxError:Unexpected token”。 我无法弄清楚为什么会发生这种情况......有什么帮助吗?
答案 0 :(得分:4)
(
function foo(){ alert("Hello world!");}
)
在上面的行中,我们定义了一个函数foo,它被解释为一个函数对象。
(
function foo(){ alert("Hello world!");}
)();
我们现在调用该函数(使用函数对象)。
注意:您使用paranthesis的方式实际上是错误的。以上是使用它们的正确方法。
<强>更新强>:
这实际上是一个很好的问题。我把它弄乱了一段时间,得出以下结论。 (注意,我可能有点不对,如果是的话请告诉我。)
关于JS-engine解析代码的方式。当它解析function foo(){ alert("Hello world!");}
时,它会将其视为函数声明。它(可能)不是调用函数的语句(可能是根据语言的语法)。
但是,以下代码可以使用
<script type=text/javascript>
[function foo(){ alert("Hello world!");}()]
</script>
也是这个:
<script type=text/javascript>
1,function foo(){ alert("Hello world!");}()
</script>
(显然是上面问题中的那个)
我认为这是因为JS解析器需要(..)
内的表达式,即它第一次看到(
时。这也发生在上面第二个代码中的comma-operator
以及初始化数组时(在第一个代码中)。但是当没有使代码(函数)看起来像表达式的标记时,parses在遇到最后一个()
时会抛出错误。
更新2 (非常感谢Felix Kling):
请参阅有关语法in CMS's response部分的详细说明。这个答案非常清楚地解释了我上面所说的内容,即JS Parses如何区分函数声明和函数表达式
(
function foo(){ alert("Hello world!")}()
)
是一个函数表达式。因此它执行时没有任何错误。
但是在
function foo(){ alert("Hello world!")}<<STOP>>()
直到<<STOP>>
的内容被解析为函数声明而不是函数表达式。因此,当它在(
之后遇到第一个<<STOP>>
时,它会标记错误。
答案 1 :(得分:0)
这是一个自动执行的功能,这里还有另一个问题:What is the purpose of a self executing function in javascript?