为什么在没有分号的javascript中仍然有效?

时间:2012-05-14 18:40:03

标签: javascript

如何在javascript中调用函数而不用;

例如

让我们说testMethod在某个地方宣布....

testMethod();

testMethod() // without semicolon will still work.

还调用元素中的方法 示例

<input type="button" onclick="testMethod();" />
<input type="button" onclick="testMethod()" /> // again no semicolon.

3 个答案:

答案 0 :(得分:29)

这是一项名为“自动分号插入”(或ASI)的功能。

来自Dealing with JavaScript's Automatic Semicolon Insertion

  

那么这些分号是如何为您插入的?遵循这些规则   (从ECMA-262第3版,7.9.1转述和简化):

     
      
  • 当解析程序时,遇到任何语法产生不允许的令牌(称为违规令牌),如果出现以下一种或多种情况,则会在违规令牌之前自动插入分号是真的:      
        
    1. 违规令牌通过至少一个LineTerminator与前一个令牌分开。
    2.   
    3. 违规令牌是}。
    4.   
  •   
  • 结束的时候   遇到令牌输入流,解析器无法将输入令牌流解析为单个完整程序,然后在输入流的末尾自动插入分号。
  •   
  • 当某些语法生成允许时,令牌是受限制的令牌,但是生产是限制生产,令牌将是注释后面的终端或非终端的第一个令牌“[此处没有LineTerminator] “在生产中。
  •   
     

如果此外,受限制的令牌与前一个令牌至少由一个LineTerminator分隔,则会在受限制的令牌之前自动插入分号。

     

...

答案 1 :(得分:1)

因为JavaScript引擎认为它们应该在那里,所以它会在行尾放置分号。这通常会引入错误而不是避免错误:

return
{
  user: 'foo'
}

上面的return语句返回...... nothing:

return;
{
  user: 'foo'
}

答案 2 :(得分:1)

javascript解释器将为您添加分号。省略分号是一个非常糟糕的主意,因为它可能导致解释的javascript行为与你期望的不同。

请参阅wikipedia上的例子:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

相关:

Do you recommend using semicolons after every statement in JavaScript?