JavaScript – 缺less语法错误

我偶然发现了这个奇怪的东西。 我在GitHub上写了一些问题,如你所知,在GitHub文章中使用某些语言突出显示,你应该把它封装在tripple 重音 。 例如,如果你想使用JavaScript,你应该这样做:

```JavaScript // Your code ``` 

它将在您的代码片段中使用JavaScript突出显示。

然而,当我在那里写一篇文章时,我不小心复制了从编辑模式(包括严重口音)剪切的整个代码,并将其粘贴到js文件中。 不过,我忘了删除重音符号。 这是我在js文件中的代码:

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

当然,这应该是语法错误。 但是,令我惊讶的是,Node.js编译没有任何错误。 我无法相信。 没有cyntax错误。 这怎么可能?

所以,我认为tripple重音在JavaScript中有特殊的含义(也许像Python中的多行string?)。 我在互联网search,但我什么也没find。 为什么EcmaScript允许这样做? 它是什么样的用法呢?

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

按照12.3.7.1 Runtime Semantics: Evaluation解释12.3.7.1 Runtime Semantics: Evaluation作为expression式后跟模板文字。

所以,第一个空的模板文字被评估为空string,然后将其作为标签应用于第二个模板文字。

MemberExpression : MemberExpression TemplateLiteral

  1. tagRef是评估MemberExpression的结果。
  2. thisCall成为这个MemberExpression
  3. tailCall成为IsInTailPosition(thisCall)
  4. 返回EvaluateCall(tagRef, TemplateLiteral, tailCall)

所以它抛出一个string不是一个函数。

这个语法是允许的,因此可以通过任意的expression式求值来获得标签,例如:

 foo.bar`str` 

反引号是ES2015的JavaScript语法的一部分,用于模板文字 。

您的代码不包含任何词法语法错误,因为模板标记语法试图评估第二个和第三个模板,所以模板版本将在运行函数时引发错误。 所以要重申一下:没有语法错误存在,但是,当你考虑模板标记时,实际上最终得到评估的方式是

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

哪个不行,因为""不是一个函数。 反引号之前的字符是一个标记function。 如果你用一个函数replace了第一组反引号,它将起作用:

 function format(msg) { return function(secondMsg) { return "!!" + msg + secondMsg + "!!"; }; } console.log(format`Javascript\n console.log(1);\n```)