JavaScript解释器忽略语法错误

时间:2016-09-24 07:24:09

标签: javascript syntax-error

这段简短的代码显然有问题:

if (5 > 2) {
  console.log("5 > 2");
} else (5 < 2) {
  console.log("5 < 2");
}

不应指定else的条件。正如预期的那样,执行此代码将导致SyntaxError: Unexpected token {

问题在于,经过微小的改动(将左支架转移到新线)后,解释器将忽略语法错误。

此代码:

if (5 > 2) {
  console.log("5 > 2");
} else (5 < 2)
{
  console.log("5 < 2");
}

导致此输出(在chrome和firefox中测试):

5 > 2
5 < 2

这怎么可能?为什么不将此else视为语法错误?

3 个答案:

答案 0 :(得分:6)

不同之处在于,在第二种情况下,回车使第二个支撑块成为独立块,而不是其中括号部分是else子句的else子句的一部分。第二种情况相当于:

if (5 > 2) {
    console.log("5 > 2");
} else {
    (5 < 2)
}

{
    console.log("5 < 2");
}

只是:

if (5 > 2) {
    console.log("5 > 2");
} else {
    false
}

console.log("5 < 2");

答案 1 :(得分:3)

全部是因为Automatic Semicolon Insertion,当您将此大括号转移到下一行时,JS引擎会将您的代码“翻译”为:

if (5 > 2) {
  console.log("5 > 2");
} else (5 < 2);
{
  console.log("5 < 2");
}

这显然是正确的,因为JS允许放置独立的块。

答案 2 :(得分:3)

不同解释的原因是ECMAScript Rules of Automatic Semicolon Insertion

中的第一个
  
      
  1. 当从左到右解析程序时,遇到任何语法生成不允许的令牌(称为违规令牌),然后在违规令牌之前自动插入分号,如果满足以下一个或多个条件:

         
        
    • 违规令牌通过至少一个LineTerminator与前一个令牌分开。
    •   
    • 违规令牌为}
    •   
  2.   

在您的情况下,违规令牌为{。在代码的第一个版本中,上面引用的项目符号条件都不是真的,因此不会插入分号,并且会引发语法错误。

在代码的第二个示例中,有一个行终止符,如第一个条件中所述。在这种情况下,会自动插入分号,因此解析后的代码实际上就是这样:

if (5 > 2) {
  console.log("5 > 2");
} else (5 < 2);
{
  console.log("5 < 2");
}

现在代码有效,因为分号后面的左括号被解释为代码块的开头,而不是else之后的表达式的一部分。

请注意,即使此代码现在解析,很明显else部分中的表达式也没有效果。