2017-04-26 87 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