ES6导入的代码是否严格?

时间:2015-11-28 22:20:04

标签: javascript import module strict

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

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

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

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

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

  

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

以及"模块代码的definition,"

  

模块代码是源文本,代码以ModuleBody提供。

一个ModuleBody consists of一个ModuleItemList,其中包含ModuleItem个,其中可能包含ImportDeclarationExportDeclarationStatementListItem,以及StatementListItem could be一个StatementDeclaration。这意味着任何代码都可以是"模块代码"取决于它加载的上下文,即使没有importexport声明的预定。

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

  

此记录所代表的模块使用的所有ModuleSpecifier字符串的列表,用于请求输入模块。

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

1 个答案:

答案 0 :(得分:0)

来自this conversation

  

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

     

ModuleBody is optional开始,空程序就是一个模块。   空程序不包含导出语句。

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

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