ES6 导入的代码是否严格
Is ES6 imported code strict?
假设我有一个依赖于非严格语义的库,例如强制将顶级this
强制到全局对象:
this.library = { foo: function () {} };
假设我尝试使用 import
导入此库:
import './library';
library.foo();
由于我使用了 import
,这是否意味着库代码隐式地在严格模式下运行(并且中断,因为this
在严格代码中undefined
(?ECMAScript 规范说,
模块代码始终是严格模式代码。
对于"模块代码"的定义,
模块代码是作为
ModuleBody
提供的代码的源文本。
ModuleBody
由ModuleItemList
组成,由ModuleItem
组成,可以包括ImportDeclaration
、ExportDeclaration
和StatementListItem
,而StatementListItem
可以是Statement
或Declaration
。这意味着任何代码都可以是"模块代码",具体取决于它加载的上下文,即使没有import
或export
声明的先见之明。
此外,15.2.1.16 中[[RequestedModules]]
字段的定义意味着 ImportDeclaration
中使用的ModuleSpecifier
确实指定了"模块"的名称:
此记录表示的模块用于请求导入模块的所有
ModuleSpecifier
字符串的列表。
看起来模块系统与非严格代码向后不兼容。这是真的吗?
从这个对话:
模块不是包含导入/导出的 JavaScript 程序 语句。仅仅因为它们可能包含导入/导出语句 并不意味着他们必须拥有它们。你不能总是看一个 编程并确定它是否是一个模块。
由于 ModuleBody 是可选的,因此空程序是 Module。 空程序不包含导出语句。
所以,是的,模块系统向后不兼容非严格代码。我认为不使用模块系统的代码并不适合参与系统,因为它可能会导出全局变量,这违背了它的目的。
因此,为了进行互操作,必须更新旧代码以提供export
声明或使用严格模式(和/或"保证"非严格技术,如Function('return this')()
,而不是所谓的非严格顶级this
(。
- 是否存在React Native“;WEB代码安全防护”;
- 如何检查这个代码点火器php函数是否工作,该函数是否在ajax url中使用
- 调试一个简单的jQuery函数;想知道是否与其他代码冲突
- 是否有一种方法可以使用公共代码库在Java和JavaScript中进行输入验证
- 是否可以在JavaScript中包含HTML代码
- 检查用户是否具有角色分析云代码
- 是否可以将此javascript代码(或其中的一部分)移动到单独的文件中,而不是内联
- Javascript:是否可以读取外部脚本的原始代码
- JS代码有什么问题,让我知道代码是否可以改进
- 确定 JavaScript 代码是否为表达式
- 是否有脚本/代码可以一次将链接属性添加到多个链接
- 是否可以将类添加到解析云代码中
- 是否有可能在 WebBrowser 控件中调试 JavaScript 代码
- 如何检查Firefox是否使用asm.js代码
- 是否有一个Javascript函数可以使代码在运行时延迟
- 是否可以向用户发送javascript代码's浏览器安全
- 我需要让用户输入他的出生日期,并使用javascript检查其形式是否正确.我的代码不起作用
- PHP是否以与JavaScript相同的方式解释代码
- adal.js是否支持授权代码授予流
- jQuery-用于检查是否有任何字段不为空,然后将所有字段设为必需字段的代码