JavaScript - 缺少语法错误

JavaScript - Missing Syntax Error

我偶然发现了这个奇怪的东西。我在 GitHub 上写了一些问题,如你所知,要在 GitHub post 中使用一些语言高亮显示,你应该将它封装在 tripple grave accent 中。例如,如果你想使用 JavaScript,你应该这样做:

```JavaScript
// Your code
```

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

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

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

当然应该是语法错误。但是,令我惊讶的是 Node.js 编译它没有任何错误。我简直不敢相信。根本没有语法错误。这怎么可能?

所以,我认为三重重音符号在 JavaScript 中具有特殊含义(也许是像 Python 中那样的多行字符串?)。我在互联网上搜索,但一无所获。为什么 EcmaScript 允许这样做?它的使用示例是什么?

从 ES2015 开始,反引号是 Javascript 语法的一部分,用于 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```)

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

根据 12.3.7.1 Runtime Semantics: Evaluation 被解释为后跟模板文字的表达式。

因此,第一个空模板文字被评估为空字符串,然后将其作为标记应用于第二个模板文字。

MemberExpression : MemberExpression TemplateLiteral

  1. Let tagRef be the result of evaluating MemberExpression.
  2. Let thisCall be this MemberExpression.
  3. Let tailCall be IsInTailPosition(thisCall).
  4. Return EvaluateCall(tagRef, TemplateLiteral, tailCall).

所以它抛出,因为字符串不是函数。

允许使用此语法,以便可以通过任意表达式评估获得标签,例如:

foo.bar`str`