JavaScript - 缺少语法错误

时间:2017-04-20 01:01:40

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

我发现这件事很奇怪。我在GitHub上写了一些问题,如你所知,在GitHub帖子中使用一些语言高亮显示你应该将它封装在tripple grave accent中。例如,如果要使用JavaScript,则应执行以下操作:

```JavaScript
// Your code
```

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

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

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

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

所以,我认为tripple grave accent在JavaScript中有特殊意义(也许像Python中的多行字符串?)。我在互联网上休息,但我一无所获。为什么EcmaScript允许这样做?它的一个例子用途是什么?

2 个答案:

答案 0 :(得分:3)

反引号是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```)

答案 1 :(得分:-1)

handle_string

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

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

  

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

     
      
  1. MemberExpression : MemberExpression TemplateLiteral成为评估tagRef的结果。
  2.   
  3. MemberExpression成为thisCall
  4.   
  5. MemberExpressiontailCall
  6.   
  7. 返回IsInTailPosition(thisCall)
  8.   

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

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

EvaluateCall(tagRef, TemplateLiteral, tailCall)