【问题标题】:JavaScript - Missing Syntax ErrorJavaScript - 缺少语法错误
【发布时间】:2017-04-20 01:01:40
【问题描述】:

我偶然发现了这个奇怪的东西。我在 GitHub 上写了一些问题,如您所知,要在 GitHub 帖子中使用某些语言突出显示,您应该将其封装在三重 grave accent 中。例如,如果你想使用 JavaScript,你应该这样做:

```JavaScript
// Your code
```

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

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

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

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

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

【问题讨论】:

  • @JaromandaX。 "repl: Unexpected token (1:8)" - 这就是我在你的链接上得到的。
  • @JaromandaX。也许下次你应该先转义特殊字符,而不仅仅是复制粘贴链接。

标签: javascript node.js ecmascript-6 v8 ecmascript-2016


【解决方案1】:

从 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```)

【讨论】:

  • @zerkms 也想知道...也许他们认为它编译为 Javascript`console.log(1);`
  • 这个答案是错误的。它与我发布的内容不等效,因为它不会在调用 test 时引发错误。
  • 同样,这不等同于我所写的,因为使用模板文字调用和使用字符串调用的行为不同。不过,我明白你在说什么。
【解决方案2】:
  ```JavaScript
  console.log(1);
  ```

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

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

MemberExpression : MemberExpression TemplateLiteral

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

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

这种语法是允许的,因此可以获得标签作为任意表达式评估的结果,例如:

foo.bar`str`

【讨论】:

  • 是的,我使用 Babel 解决了这个问题。但是,我仍然想知道为什么甚至允许这样做?有什么用吗?
  • @hesoyam_ 您可以检索对标记的引用作为表达式。例如:“foo.bar`str`”。所以这种情况是允许的。
  • 是的,我知道。但我问有没有像我的帖子那样使用三重文字?
  • @hesoyam_ 这不是三重文字,它是一个表达式(由一个空模板文字组成),后跟一个模板文字。实际上 - 它无法评估,因为空字符串不是函数。
  • 不,我问了一些不同的问题。我问我发的东西有用吗?将模板文字标记为模板文字有什么用途吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多