js引擎什么时候插入分号?

时间:2011-11-28 01:35:16

标签: javascript

  

可能重复:
  What are the rules for Javascript's automatic semicolon insertion?

我知道你可以在不同的行上链接js(或jquery),如下所示:

$('div')
    .filter(':first').hide().end()
    .find('span').css('opacity', .5)
    ...;

发动机没有用分号打破它。另一方面,如果我这样做:

return
    i ? 1 : 2

它输入分号并始终返回undefined。什么时候做什么准则?

4 个答案:

答案 0 :(得分:2)

编辑:看起来Javascript在新线路上添加了分号,只要它有意义。如果第二行以“。”开头,那么您的第一个示例将不是有效的javascript。所以它假设它是一行,而在你的第二个例子中,每一行都可能是有效的js。例如:

return
1 + 2;

返回undefined,同时返回:

return 1 +
2;

return 1
+ 2;

返回3,因为至少有一行不能生成有效的js。

答案 1 :(得分:1)

http://inimino.org/~inimino/blog/javascript_semicolons有一个很好的解释。引用它:

  

3。当遇到“限制生产”并且在语法包含注释“[此处没有LineTerminator]”的地方包含行终止符时,则插入分号。

     

[...]

     

受限制的制作是断行不能出现在特定位置的制作,因此如果出现换行符,它将阻止程序以这种方式解析,尽管它仍然可以用另一种方式解析。

     

语法中有五个限制生成,它们是后缀运算符++--,continue语句,break语句,return语句和throw语句。

     

[...]

     

请注意,return语句可以包含表达式中的换行符,而不是return标记和表达式开头之间的换行符。

换句话说,return ...是一个特定的构造,其中,如果你在return之后放置一个换行符,JavaScript将插入一个分号。还有其他几种这样的结构;但除了这些之外,如果没有方法可以理解你的代码,JavaScript只会插入一个分号。

答案 2 :(得分:0)

在第一个示例中,单独使用后续行是无效语法。

在你的第二个例子中,第二行是有效的(虽然没用)语句。

有关更精确的规则,请参阅spec,其中包含三页。

答案 3 :(得分:0)

这更好地描述为结束语句解析而不是插入分号。在JS中,分号纯粹是装饰性的。

解析器在具有完整语句时停止。返回的行为正是您应该期望的,因为没有参数的返回是一个合法的陈述。如果你不小心这似乎是唯一可能让你陷入麻烦的情况,因为JS无法读懂你的想法。

将return参数放在一个单独的行上即使解析正确也是病态的。