3

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

JS中圆括号的含义如下:

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

它按预期工作并显示“Hello world!”。但是如果我拉下括号

 <script>

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

</script>

Chrome 控制台生成错误“Uncaught SyntaxError: Unexpected token )”。我无法弄清楚为什么会发生这种情况......有什么帮助吗?

4

2 回答 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 解析器需要一个表达式,(..)即当它第一次看到(. comma-operator上面第二个代码中的 as 以及初始化数组时(在第一个代码中)也会发生这种情况。但是,当没有使代码(函数)看起来像表达式的标记时,解析器在遇到 last 时会抛出错误()

更新2(非常感谢Felix Kling):

请参阅CMS回复中有关语法部分的详细说明。这个答案非常清楚地解释了我上面所说的,即 JS Parses 如何区分函数声明函数表达式

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

是一个函数表达式。因此它执行没有任何错误。

但在

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

内容直到<<STOP>>被解析为函数声明而不是函数表达式。因此,当它遇到第一个时(<<STOP>>它会标记一个错误。

于 2012-06-03T11:19:15.980 回答
0

它是一个自执行函数,这里还有一个关于这个主题的问题:javascript 中自执行函数的目的是什么?

于 2012-06-03T11:15:42.057 回答