2

如果我use strict用反引号/模板文字括起来,则“使用严格”不会按预期工作。你能分享一下背后的原因吗?是否有任何类似的异常声明模板文字无法按预期工作?

`use strict`;
x = 3.14;  // Ideally it should  cause an error (as x is not defined).
alert(x);

`use strict`; // if we enclose in single quotes or double quotes
x = 3.14;    // Ideally it should  cause an error (as x is not defined).
alert(x);
4

2 回答 2

5

它就是这样设计的。

来自ES6 规范

14.1.1 指令序言和使用严格指令

指令序言是最长的ExpressionStatement产生序列,作为FunctionBodyScriptBodyModuleBody的初始StatementListItemModuleItem产生出现,其中序列中的每个ExpressionStatement完全由一个StringLiteral标记和一个分号组成。分号可以显式出现,也可以通过自动分号插入来插入。指令序言可能是一个空序列。

Use Strict Directive 是 Directive Prologue 中的ExpressionStatement,其StringLiteral是确切的代码单元序列"use strict"'use strict'. 使用严格指令可能不包含EscapeSequenceLineContinuation

指令序言可能包含多个使用严格指令。但是,如果发生这种情况,实现可能会发出警告。

强调我的。

它明确指出,要使 Use Strict 指令起作用,它必须用单引号或双引号编写,但模板文字根本不允许用于此目的。

于 2021-02-15T08:32:14.127 回答
3

这是因为Use Strict 指令在规范中明确定义为完全由StringLiteral产生式组成的ExpressionStatement,并将确切的代码点序列限制为or 或。"use strict"'use strict'

来自ECMAScript 2020 语言规范

14.1.1 指令序言和使用严格指令

Directive PrologueExpressionStatement的最长序列,作为FunctionBodyScriptBodyModuleBody初始StatementListItemModuleItem出现,其中序列中的每个ExpressionStatement完全由StringLiteral标记和分号组成。分号可以显式出现,也可以通过自动分号插入来插入。指令序言可能是一个空序列。

Use Strict DirectiveDirective Prologue中的ExpressionStatement,其StringLiteral是确切的代码点序列或. 使用严格指令可能不包含EscapeSequenceLineContinuation"use strict"'use strict'

指令序言可能包含多个Use Strict Directive。但是,如果发生这种情况,实现可能会发出警告。

强调添加

另一方面,TemplateLiteral与StringLiteral完全不同,因此不能是有效的指令。

于 2021-02-15T08:28:39.440 回答