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
- Let
tagRef
be the result of evaluating MemberExpression
.
- Let
thisCall
be this MemberExpression
.
- Let
tailCall
be IsInTailPosition(thisCall)
.
- Return
EvaluateCall(tagRef, TemplateLiteral, tailCall)
.
所以它抛出,因为字符串不是函数。
允许使用此语法,以便可以通过任意表达式评估获得标签,例如:
foo.bar`str`
我偶然发现了这个奇怪的东西。我在 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
- Let
tagRef
be the result of evaluatingMemberExpression
.- Let
thisCall
be thisMemberExpression
.- Let
tailCall
beIsInTailPosition(thisCall)
.- Return
EvaluateCall(tagRef, TemplateLiteral, tailCall)
.
所以它抛出,因为字符串不是函数。
允许使用此语法,以便可以通过任意表达式评估获得标签,例如:
foo.bar`str`