圆括号 JavaScript

3
可能重复:
在JavaScript中,对象/函数/类声明周围的括号是什么意思?

当在JS中使用如下方式时,圆括号的含义是什么:

<script>
(
 function foo(){ alert("Hello world!")}()
)
</script>

它按预期工作并显示“Hello world!”。但如果我去掉括号。
 <script>

 function foo(){ alert("Hello world!")}()

</script>

Chrome控制台显示错误信息“Uncaught SyntaxError: Unexpected token ) ”。 我无法弄清楚为什么会出现这种情况...有人可以帮忙吗?

更好的复制:解释JavaScript的封装匿名函数语法 - Felix Kling
2个回答

4
(
 function foo(){ alert("Hello world!");}
)

在上面的代码行中,我们定义了一个名为foo的函数,该函数被解释为函数对象。
(
 function foo(){ alert("Hello world!");}
)();

我们现在正在调用函数(使用函数对象)。 更新: 这其实是一个很好的问题。我尝试了一段时间并得出了以下结论。(注意,我可能非常错误,请告诉我。)
这涉及到JS引擎解析代码的方式。当它解析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解析器在(..)内部期望一个表达式,即当它第一次看到(时。这也发生在第二个代码中的逗号操作符和初始化数组时(在第一个代码中)。但是,当没有标记使得代码(函数)看起来像一个表达式时,当解析器遇到最后一个()时就会抛出错误。

更新2(非常感谢Felix Kling提供的帮助):

请参考关于语法部分的详细说明CMS回答中的这段话。这个答案非常清楚地解释了我上面所说的JS解析器如何区分函数声明函数表达式

(
 function foo(){ alert("Hello world!")}()
)

这是一个函数表达式。因此,它可以在不产生任何错误的情况下执行。

但在

 function foo(){ alert("Hello world!")}<<STOP>>()

<<STOP>>开始到内容结束的部分被解析为函数声明,而不是函数表达式。因此,当它在<<STOP>>之后遇到第一个(时,会提示错误。


问题是在问为什么去掉外面的括号会导致错误。你没有解释这个。 - Quentin
原问题中括号的使用方式没有任何问题(除了第二个例子显然会引发问题,这也是问题的主题)。 - Quentin
@Quentin 是的,你说得对。已经更新了。 - UltraInstinct
你的结论是正确的。另外请看这个答案:https://dev59.com/JHI-5IYBdhLWcg3w3crS#1634321 - Felix Kling
@FelixKling 你说得很对!那就是这个问题的确切答案。在你评论之前,我正在这里搜索特定的语法行:http://www.antlr.org/grammar/1153976512034/ecmascriptA3.g 我会用它更新我的答案。谢谢 :) - UltraInstinct
谢谢大家!你们讲解得非常清楚! - Luca Adalberto Vandro

0

错误的括号集。问题是关于语句周围的那些括号,而不是在 } 后一起出现的一对括号。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接