我发现这件事很奇怪。我在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允许这样做?它的一个例子用途是什么?
答案 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); ```
- 让
MemberExpression : MemberExpression TemplateLiteral
成为评估tagRef
的结果。- 让
MemberExpression
成为thisCall
。- 让
MemberExpression
为tailCall
。- 返回
醇>IsInTailPosition(thisCall)
。
因为字符串不是函数所以它会抛出。
允许使用此语法,以便可以通过任意表达式评估获取标记,例如:
EvaluateCall(tagRef, TemplateLiteral, tailCall)