首页 > 解决方案 > IIFE、模块和 JS

问题描述

我试图理解一些代码:

(function (exports) {

 exports.myProperty = "azerty";

 console.log(exports)

}((this.myModule = this.myModule || {})));

我从这段代码中了解到:

1)我正在执行一个 IIFE,“this”代表 Window(全局对象)。

2) 由于 Window 没有 myModule 属性,因此 this.myModule = this.myModule 向 Window 对象添加了一个新属性,并且该属性未定义。

3) (this.myModule=this.myModule) || {} 返回 {},因此导出等于 {}(空对象)

4)我添加一个属性“myProperty”来导出对象所以export = {myProerty:“azerty”}

我不明白的是:执行此代码后,当我 console.log(window) 时,我可以看到:

在此处输入图像描述

Window 对象有一个属性 myModule 等于 export 对象。myModule 和 {myProperty: "azerty"} 之间的关系是如何解决的?我无法理解这部分。

标签: javascriptecmascript-5iife

解决方案


你的#3是错误的。原代码中的括号是这样的:

(this.myModule=this.myModule || {})

它的评估是这样的:

this.myModule = (this.myModule || {})

如果创建了一个新的空对象,则会立即将其分配给this.module,然后再exports通过函数参数分配给它。因此window.myModuleexports都是对同一个对象的引用。


推荐阅读