2017-04-20 107 views
2

我偶然發現了這個奇怪的事情。我在GitHub上寫了一些問題,如你所知,在GitHub文章中使用某種語言突出顯示,你應該把它封裝在三聯grave accent。例如,如果您要使用JavaScript,您應該這樣做:JavaScript - 缺少語法錯誤

```JavaScript 
// Your code 
``` 

它將在您的代碼段中使用JavaScript突出顯示。但是,當我在那裏寫一篇文章時,我不小心複製了從編輯模式(包括嚴重口音)中剪下的整個代碼,並將其粘貼在js文件中。不過,我忘了刪除重音符號。這是我在js文件中的代碼:

function test(){ 
    ```JavaScript 
    console.log(1); 
    ``` 
} 

當然,它應該是語法錯誤。但是,令我驚訝的是,Node.js編譯它時沒有任何錯誤。我無法相信。根本沒有cyntax錯誤。這怎麼可能?

所以,我想tripple grave accent在JavaScript中有特殊的含義(也許像Python中的多行字符串?)。我在互聯網上搜索,但我什麼也沒找到。爲什麼EcmaScript允許這樣做?它的一個例子是什麼?

+0

@JaromandaX。 *「repl:Unexpected token(1:8)」* - 這就是我的鏈接。 –

+0

@JaromandaX。也許下次你應該首先逃脫特殊字符,而不僅僅是複製粘貼鏈接。 –

回答

-1
```JavaScript 
    console.log(1); 
    ``` 

被解釋爲每12.3.7.1 Runtime Semantics: Evaluation的表情,接着文字模板。

因此,第一個空模板文字被評估爲空字符串,然後將其作爲標籤應用於第二個模板文字。

MemberExpression : MemberExpression TemplateLiteral

  1. tagRef是評估MemberExpression的結果。
  2. thisCall成爲這個MemberExpression
  3. tailCallIsInTailPosition(thisCall)
  4. 返回EvaluateCall(tagRef, TemplateLiteral, tailCall)

因此,它拋出一個字符串不是函數。

該語法被允許,以便它可能獲得標籤作爲任意表達式求值的結果,例如:

foo.bar`str` 
+0

是的,我使用Babel計算出來的。但是,我仍然想知道爲什麼甚至允許?有沒有使用它? –

+0

@hesoyam_您可以檢索對標籤的引用作爲表達式。例如:「foo.bar \'str \'」。所以這種情況是允許的。 – zerkms

+0

是的,我知道。但我問是否有任何使用tripple文字就像我的帖子? –

3

反向鏈接是Javascript的語法的一部分,自ES2015起,用於template literals

您的代碼不包含任何詞法語法錯誤,因爲template tagging語法試圖評估第二個和第三個模板,所以在運行函數時,模板版本將引發錯誤。因此,要重申:但不存在語法錯誤,當你考慮模板標籤,這實際上最終得到評估的方法是

""("Javascript\n console.log(1);\n")("") 

這將無法工作,因爲""不是一個函數。在反引號之前需要將字符作爲標記功能。如果更換了第一個與函數反引號的,它的工作:

function format(msg) { 
 
    return function(secondMsg) { 
 
    return "!!" + msg + secondMsg + "!!"; 
 
    }; 
 
} 
 

 

 
console.log(format`Javascript\n console.log(1);\n```)

+0

@zerkms想知道同樣的...也許他們認爲它編譯爲'Javascript \'console.log(1); \'' –

+0

這個答案是錯誤的。它與我發佈的內容**不等同,因爲它在調用'test'時不會出錯。 –

+0

再次,這不等同於我寫的,因爲使用模板字面值調用和使用字符串調用行爲不同。不過,我明白你在說什麼。 –