ES6 导入的代码是否严格

Is ES6 imported code strict?

本文关键字:是否 代码 导入 ES6      更新时间:2023-09-26

假设我有一个依赖于非严格语义的库,例如强制将顶级this强制到全局对象:

this.library = { foo: function () {} };

假设我尝试使用 import 导入此库:

import './library';
library.foo();

由于我使用了 import ,这是否意味着库代码隐式地在严格模式下运行(并且中断,因为this在严格代码中undefined(?ECMAScript 规范说,

模块代码始终是严格模式代码。

对于"模块代码"的定义,

模块代码是作为ModuleBody提供的代码的源文本。

ModuleBodyModuleItemList组成,由ModuleItem组成,可以包括ImportDeclarationExportDeclarationStatementListItem,而StatementListItem可以是StatementDeclaration。这意味着任何代码都可以是"模块代码",具体取决于它加载的上下文,即使没有importexport声明的先见之明。

此外,15.2.1.16 中[[RequestedModules]]字段的定义意味着 ImportDeclaration 中使用的ModuleSpecifier确实指定了"模块"的名称:

此记录表示的模块用于请求导入模块的所有ModuleSpecifier字符串的列表。

看起来模块系统与非严格代码向后不兼容。这是真的吗?

从这个对话:

模块不是包含导入/导出的 JavaScript 程序 语句。仅仅因为它们可能包含导入/导出语句 并不意味着他们必须拥有它们。你不能总是看一个 编程并确定它是否是一个模块。

由于 ModuleBody 是可选的,因此空程序是 Module。 空程序不包含导出语句。

所以,是的,模块系统向后不兼容非严格代码。我认为不使用模块系统的代码并不适合参与系统,因为它可能会导出全局变量,这违背了它的目的。

因此,为了进行互操作,必须更新旧代码以提供export声明或使用严格模式(和/或"保证"非严格技术,如Function('return this')(),而不是所谓的非严格顶级this(。