2017-04-26 86 views
1

在ECMAScript和AFAIR中有一个自动分号插入规则,它表示如果可能的话(无语法错误)将分号插入行尾,则插入分号。为什么ASI规则忽略箭头函数中的换行符?

这里有一个Y-combinator,使用箭头功能写着:

var Y = (F) => 
    (x => F(y => x(x)(y))) 
    (x => F(y => x(x)(y))) 

这将是一个语法错误,在第一行的末尾插入;,但它的工作原理为第二(第三,但没关系)。 所以表达式应该被解析为:

var Y = (F) => 
    (x => F(y => x(x)(y))); 
    (x => F(y => x(x)(y))); 

但随着;把明确二号线代码的工作方式不同是肯定的,所以没有ASI规则。

问题:为什么不插入分号?

+0

“*如果可能,插入分号*” - 否。 *必要时插入**以避免语法错误* – Bergi

+1

另外'const Y = f => x => f(Y(f))(x)' – naomik

回答

1

该规则比insert ";" if it can稍微微妙一些。确切的规则在节7.9.1部分1指定:

当,作为上述程序的从左至右解析,当遇到标记(称为 违规令牌)未被任何生产 允许语法,那么分号自动 违规令牌之前,如果一个或多个下列条件之一为真插入:

  1. 有问题的令牌从令牌以前通过至少一个 分离LineTerminator。

  2. 有问题的令牌是}。

所以,它不会在一个换行符如果可能的话插入。相反,它解析代码,直到出现“冒犯令牌”。然后它回溯一个字节,看看是否有换行符。如果有,它会插入一个分号。

就个人而言,这并不是一个简单的规则,因为我的大脑习惯了,所以我更喜欢自己添加分号。

+1

ES6的右边部分是[11.9.1 ](http://www.ecma-international.org/ecma-262/6.0/#sec-rules-of-automatic-semicolon-insertion) – n00dl3