2017-02-03 30 views
0

考慮下面的代碼:ES6模板字符串和自動插入分號

`abc`.split(`b`) 
`abc`.split(`b`) 

這種失敗TypeError: "abc".split(...) is not a function

Try it here.

要使其工作,我們需要插入這兩個之間用分號聲明。 同樣的代碼工作正常,如果我們用一個普通字符串對下聯:

`abc`.split(`b`) 
"abc".split(`b`) 

什麼是這種現象的原因?

我想這與自動分號插入做一些令人毛骨悚然的東西有關,但我無法弄清楚這將是什麼。
另外,常規模板字符串和模板字符串之間似乎有區別的事實讓我感到困惑。這些不應該是相等的嗎?

+1

分號的自動插入並不意味着你總是可以將它們排除在外,在某些情況下,它們確實需要避免出現問題,這似乎是其中分號不是有效語法的地方之一插入。 – adeneo

回答

6

模板文字可以是tagged with a function,字符串文字不能。請注意,

tag`a ${x} b`; 

基本上等同於

tag("a ", x, " b"); 

因爲你的表情`abc`.split(`b`) `abc`.split(`b`)在語法上是有效的,有no automatic semicolon insertion這裏發生的一切。不要忽略必要的分號。這不是說ASI在做什麼怪事,它只是在你期望的時候什麼都不做。

如果你想省略分號,讓他們自動插入其中沒有需要可能,你會在每次與([/+-`開始行need to put one at the begin