ecmascript语法规则-[第800期] ECMAScript 2016中你不知道的变化

2023-09-05 0 3,988 百度已收录

前言

第800篇文章。 另外,标题也不正确。 这是 ECMAScript 2016,不是 ECMAScript 2015。我跟不上。 今天的文章是中城翻译@公子小白翻译分享的。

正文从这里开始~

与 ECMAScript 6(也称为 ECMAScript 2015)相比,ECMAScript 2016 是对 JavaScript 语言规范的较小更新。 由于今天的 ECMAScript 每年都会发布一个新版本,因此每个版本实际上只是所有计划功能的集合。 大多数文章只列出了 ECMAScript 2016 中的两个主要变化:

以上两个特性对 JavaScript 开发者影响最为直接,然而,这次版本更新还有一个经常被忽视的重要变化。这个变化在我写的书(Understanding ECMAScript 6)中提到过,不过,我一直在对此有些困惑,所以我决定在这里将其分解。

首先我将描述更改,然后解释其背后的基本原理

这个变化

ECMAScript 2016 规定“use strict”指令不能用在参数使用默认值、解构或扩展运算符的函数体中。 该规范将简单参数列表定义为仅包含标识符的参数列表(ECMAScript 5 仅支持简单参数列表)[1]。 此更改会影响所有函数类型,包括函数声明、函数表达式、箭头函数和对象文字速记函数。 这里有些例子:

要使具有非简单参数的函数在严格模式下运行,可以在函数体外部全局使用“use strict”,例如:

在这些情况下,函数外部的“use strict”指令在语法上是正确的。 如果您使用ECMAScript模块,则不必担心这个问题,因为模块中的代码将手动以严格模式运行。

为什么会有这样的改变?

考虑到严格模式在没有简单参数列表的情况下如何工作,这些更改非常重要。 ECMAScript 5 规范中创建严格模式时,解构参数和参数默认值还不存在ecmascript语法规则,因此解析参数列表后看到“use strict”指令没有问题。 当时,“use strict”并不影响参数列表解析的结果,它仅用于检查参数标识符(不允许重复,并且不允许eval和arguments等严格禁止的标识符)。 随着 ECMAScript 6 中重构和参数默认值的引入,这种情况发生了变化,因为规范定义参数列表应该使用与函数体相同的模式进行解析(这意味着函数体中的“use strict”肯定会触发 strict模型)。

您需要意识到的第一件事是严格模式改变了 JavaScript 代码的解析和执行方式 [2]。 例如,在简单的情况下,严格模式不允许使用新的八进制文字(例如 070)。 如果以严格模式解析代码,则 070 会抛出语句错误。 考虑到这一点,您认为下面的代码将如何执行?

如果您尝试使用 JavaScript 解析器解析此代码,则参数列表将在函数体之前解析。 这意味着 070 被解析为合法。 然后在函数体中遇到“use strict”,它会告诉解析器,“你实际上应该以严格模式解析参数列表”。 在这些情况下,解析器必须在严格模式下回溯并重新解析参数列表,因此 070 将抛出语法错误。 这看起来并不是什么大问题,但是如果默认参数值很复杂怎么办?

在这些情况下,参数默认值使用函数,这会出现更多问题。 您必须设置默认值,其中函数也在严格模式下运行。 确保在严格模式下正确解析和理解参数默认值表达式可能很复杂。

解构参数会导致类似的问题,因为它可能包含默认值。 例如:

这里重构后的参数值有一个默认值,在严格模式下是不允许的,这会导致和参数默认值一样的问题。

最后,TC-39 [3] 似乎决定简单地禁止在不属于 ES5 规范(ES6 或更新标准的一部分)的函数体内使用“use strict”,以防止出现上述问题。 这也意味着具有参数默认值、解构参数和增强参数的函数将无法在函数体中使用“use strict”。 还包括使用“use strict”无效的情况,例如:

在此代码中,具有非简单参数的函数位于另一个使用“use strict”的函数内。 doSomething() 函数将在严格模式下手动执行,但 JavaScript 引擎仍会在 doSomething() 函数体中定义“use strict”指令时抛出语法错误。

对于前面的代码,在chrome 54下运行,会抛出Uncaught SyntaxError: Illegal 'use strict'directive in function with non-simpleparameter list。如果去掉中间函数的'use strict',异常会是Uncaught SyntaxError :严格模式下不允许使用八进制文字。 ——译者注

替代计划

此更改可能不会影响很多开发人员,这就是您尚未意识到的原因。 在 JavaScript 中,“use strict”指令开始成为过去,因为 ECMAScript 模块和类是在严格模式下手动执行的,没有回退,这意味着在这些情况下将不需要“use strict”。 然而ecmascript语法规则,在极少数情况下,你需要一个带有非简单参数的函数在严格模式下运行,你可以使用IIFE(Immediately-Invoked Function Expression,即立即执行的函数表达式——译者注)方法来创建这个函数。

在此代码中,在严格模式下运行的 IIFE 中创建了一个函数,这允许返回的函数在严格模式下运行并使用参数默认值,因为外部作用域已经在严格模式下运行并正确解析了参数默认值价值。 该值很好,这不需要在函数体中额外的“use strict”

总结

“use strict”禁止出现在使用非简单参数列表的函数体中。 ECMAScript 2016 的这个小变化也说明了这样一种流行编程语言的开发过程有多么困难。 在这些情况下,TC-39 决定通过在 ECMAScript 6 (2015) 中引入新的语法错误来消除歧义,如果更早的话,该错误将成为 ECMAScript 6 (2015) 的一部分。 添加这个语法错误是最明智的,因为它对现有代码影响不大(JavaScript引擎在规范更改的同时实现了非简单参数列表),并且不会影响以后的代码,因为ECMAScript模块和类都运行在严格模式。

参考

关于本文

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 ecmascript ecmascript语法规则-[第800期] ECMAScript 2016中你不知道的变化 https://www.wkzy.net/game/194494.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务