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
aModuleItemList
,它由ModuleItem
组成,可以包括ImportDeclaration
,ExportDeclaration
和StatementListItem
,以及StatementListItem
一个语句
或声明
。这意味着任何代码都可以是“模块代码”,具体取决于加载的上下文,即使没有导入
或导出
声明
此外,中的[[RequestedModules]]
字段的定义意味着在ImportDeclaration
中使用的ModuleSpecifier
确实指定了“模块”的名称:
此记录表示的模块用于请求导入模块的所有ModuleSpecifier
字符串的列表
模块系统似乎与非严格代码向后不兼容。这是真的吗?来自:
模块不是包含导入/导出的JavaScript程序
声明。只是因为它们可能包含导入/导出语句
这并不意味着他们必须拥有它们。你不能总是盯着一只眼睛看
编程并确定它是否是一个模块
因为,空程序是一个模块。
空程序不包含export语句
因此,是的,模块系统与非严格代码向后不兼容。我认为不使用模块系统的代码不适合参与系统,因为它可能导出全局变量,这违背了它的目的
因此,为了进行互操作,必须更新旧代码,以提供导出
声明或使用严格模式(和/或“保证”非严格技术,如函数('return this')()
,而不是假定的非严格顶级this
)。来源:
模块不是包含导入/导出的JavaScript程序
声明。只是因为它们可能包含导入/导出语句
这并不意味着他们必须拥有它们。你不能总是盯着一只眼睛看
编程并确定它是否是一个模块
因为,空程序是一个模块。
空程序不包含export语句
因此,是的,模块系统与非严格代码向后不兼容。我认为不使用模块系统的代码不适合参与系统,因为它可能导出全局变量,这违背了它的目的
因此,为了进行互操作,必须更新旧代码以提供导出
声明或使用严格模式(和/或“保证”非严格技术,如函数('return this')()
,而不是假定的非严格顶级this
)