Skip to content

Commit d93ad81

Browse files
authored
Update part-4.md
1 parent 51b8261 commit d93ad81

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

part-4.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ Wirfs-Brock 回忆说,在 TC39 会议期间的某个休息时间,他找到
105105
#### 严格模式
106106
ES5 严格模式直接源于 Douglas Crockford 在 JavaScript 的设计中「纠正错误和不便」的目标。其中的一些不便在当时会造成语法错误,它们在 ES5 中可以在不影响现有代码的前提下被修正。例如保留字(reserved words)既无法作为对象字面量的属性键,也无法在点号后使用。但是,仍有许多 JavaScript 的错误特性并不能被无条件修复,因为它们可能会改变现有代码的运行时行为,从而「破坏 Web」。严格模式的设想,则是使 JavaScript 开发者有机会在新代码或更新后的代码中,明确是否选择性使用(opt-in)包含了此类修复的语言方言。为此,浏览器将必须同时支持严格模式和原有非严格模式的代码。并且在理想情况下,严格模式应该能在各个独立函数的层面上选择性切换,以便现有脚本能逐步转换为使用严格模式。人们希望随着时间的流逝,严格模式能成为编写新代码的主要方言。但它该如何获得最初的采用,仍然是一个问题。有人认为要等到所有主流浏览器都实现 ES5 严格模式,可能会有相当大的延迟。而浏览器博弈论预测,如果严格模式会使脚本在某些流行的浏览器上无法使用,那么开发者将不会使用它。使严格模式符合减法原则(subtractive)可以规避这个问题。严格模式并没有向 ECMAScript 添加新特性;相反地,它删除了有问题的特性。在不支持严格模式的浏览器上运行时,无错误的严格模式代码也应该能继续按开发者的预期工作。
107107

108-
严格模式的一个早期问题,是该如何选择性地启用它。严格模式所具备的细粒度选择性,需要一种易于嵌入到脚本中的机制来实现,而不能利用类似 `<script>` 元素属性的外部手段。ES4 中考虑过提供可放置在 ECMAScript 代码内的 `use` 指令,以此来选择各种模式。但这样的指令会违反 ES3.1「不允许新语法」的设计准则。还有一种可能性是使用特殊形式的注释作为指令。但是 ES3.1 工作组也不愿意为任何形式的注释赋予语法上的意义,因为 JavaScript 压缩工具(minimizer)会删除注释。但 Allen Wirfs-Brock 发现,ECMAScript 中的 *ExpressionStatement* 语法可以将任何表达式转换成有效的语句。只要某个表达式是显式或隐式地(通过 ASI)后跟分号,那么它就可以转换成有效的语句,对仅含字符串字面量常量的表达式而言也是如此。这意味着那些诸如 `"use-strict";` 的声明,在语法上也是有效的 ES3 代码。因为这行代码只是一个常量值,所以在 ES3 中对其求值也没有副作用。同时这也是一个*空操作*<sup>[g](./appendices.md#no-op)</sup>。选择使用这样的语句作为严格模式看起来相当安全,因为任何现有的 JavaScript 代码似乎都不太可能已经利用了这样的语句形式,并且在 ES3 的实现中加载 ES5 代码时,旧版实现也都会忽略这行代码的存在。工作组采纳了这个想法,决定只要使用 `"use-strict";` 形式的声明作为脚本或函数主体的第一条语句,就表示整个脚本或函数应使用严格模式下的语义来处理。
108+
严格模式的一个早期问题,是该如何选择性地启用它。严格模式所具备的细粒度选择性,需要一种易于嵌入到脚本中的机制来实现,而不能利用类似 `<script>` 元素属性的外部手段。ES4 中考虑过提供可放置在 ECMAScript 代码内的 `use` 指令,以此来选择各种模式。但这样的指令会违反 ES3.1「不允许新语法」的设计准则。还有一种可能性是使用特殊形式的注释作为指令。但是 ES3.1 工作组也不愿意为任何形式的注释赋予语法上的意义,因为 JavaScript 压缩工具(minimizer)会删除注释。但 Allen Wirfs-Brock 发现,ECMAScript 中的 *ExpressionStatement* 语法可以将任何表达式转换成有效的语句。只要某个表达式是显式或隐式地(通过 ASI)后跟分号,那么它就可以转换成有效的语句,对仅含字符串字面量常量的表达式而言也是如此。这意味着那些诸如 `"use strict";` 的声明,在语法上也是有效的 ES3 代码。因为这行代码只是一个常量值,所以在 ES3 中对其求值也没有副作用。同时这也是一个*空操作*<sup>[g](./appendices.md#no-op)</sup>。选择使用这样的语句作为严格模式看起来相当安全,因为任何现有的 JavaScript 代码似乎都不太可能已经利用了这样的语句形式,并且在 ES3 的实现中加载 ES5 代码时,旧版实现也都会忽略这行代码的存在。工作组采纳了这个想法,决定只要使用 `"use strict";` 形式的声明作为脚本或函数主体的第一条语句,就表示整个脚本或函数应使用严格模式下的语义来处理。
109109

110110
严格模式的主要目标之一,是显式捕获那些容易产生但在运行时并不明显的编码错误。严格模式中添加了如下的新运行时错误:
111111

0 commit comments

Comments
 (0)