假设我有一个依赖非严格语义的库,比如将顶级this
强制转换为全局对象:
this.library = { foo: function () {} };
假设我尝试使用import
导入此库:
import './library';
library.foo();
由于我使用import
,这是否意味着库代码隐式在严格模式下运行(并且由于this
在严格代码中是undefined
,因此中断)? ECMAScript规范says,
模块代码始终是严格的模式代码。
以及"模块代码的definition,"
模块代码是源文本,代码以
ModuleBody
提供。
一个ModuleBody
consists of一个ModuleItemList
,其中包含ModuleItem
个,其中可能包含ImportDeclaration
,ExportDeclaration
和StatementListItem
,以及StatementListItem
could be一个Statement
或Declaration
。这意味着任何代码都可以是"模块代码"取决于它加载的上下文,即使没有import
或export
声明的预定。
此外,来自15.2.1.16的[[RequestedModules]]
字段的定义意味着ModuleSpecifier
中使用的ImportDeclaration
确实指定了"模块的名称:&#34 ;
此记录所代表的模块使用的所有
ModuleSpecifier
字符串的列表,用于请求输入模块。
模块系统似乎与非严格代码向后兼容。这是真的吗?
答案 0 :(得分:0)
模块不是包含导入/导出的JavaScript程序 声明。仅仅因为它们可能包含导入/导出语句 并不意味着他们必须拥有它们。你不能总是看一个 编程并确定它是否是一个模块。 。 。
从ModuleBody is optional开始,空程序就是一个模块。 空程序不包含导出语句。
所以,是的,模块系统与非严格代码向后兼容。我认为不使用模块系统的代码不适合参与系统,因为它可能会输出全局变量,这会破坏它的目的。
因此,为了进行互操作,必须更新旧代码以提供export
声明或使用严格模式(和/或“保证”非严格技术,如Function('return this')()
,而不是所谓的非严格的顶级this
)。