Javascript ES6导入代码是否严格?

Javascript ES6导入代码是否严格?,javascript,import,module,strict,Javascript,Import,Module,Strict,假设我有一个依赖于非严格语义的库,比如将顶级this强制到全局对象: this.library = { foo: function () {} }; 假设我尝试使用import导入此库: import './library'; library.foo(); 由于我使用了import,这是否意味着库代码隐式地在严格模式下运行(并且中断,因为此在严格代码中是未定义的)?ECMAScript规范 模块代码始终是严格的模式代码 对于“模块代码”的定义 模块代码是源文本,它是作为ModuleBody提

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

this.library = { foo: function () {} };
假设我尝试使用
import
导入此库:

import './library';
library.foo();
由于我使用了
import
,这是否意味着库代码隐式地在严格模式下运行(并且中断,因为
在严格代码中是
未定义的
)?ECMAScript规范

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

对于“模块代码”的定义

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

以及一个
ModuleBody
a
ModuleItemList
,它由
ModuleItem
组成,可以包括
ImportDeclaration
ExportDeclaration
StatementListItem
,以及
StatementListItem
一个
语句
声明
。这意味着任何代码都可以是“模块代码”,具体取决于加载的上下文,即使没有
导入
导出
声明

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

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

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

来自:

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

因为,空程序是一个模块。 空程序不包含export语句

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

因此,为了进行互操作,必须更新旧代码,以提供
导出
声明或使用严格模式(和/或“保证”非严格技术,如
函数('return this')()
,而不是假定的非严格顶级
this
)。

来源:

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

因为,空程序是一个模块。 空程序不包含export语句

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

因此,为了进行互操作,必须更新旧代码以提供
导出
声明或使用严格模式(和/或“保证”非严格技术,如
函数('return this')()
,而不是假定的非严格顶级
this