javascript - 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"} 之间的关系是如何解决的?我无法理解这部分。
解决方案
你的#3是错误的。原代码中的括号是这样的:
(this.myModule=this.myModule || {})
它的评估是这样的:
this.myModule = (this.myModule || {})
如果创建了一个新的空对象,则会立即将其分配给this.module
,然后再exports
通过函数参数分配给它。因此window.myModule
和exports
都是对同一个对象的引用。
推荐阅读
- mysql - 我有多个查询想要将所有查询结果合并到具有两列的同一个表中
- c# - HTTP 正常工作时 HTTP Post 触发错误
- c - 你能解释一下 2019 年会发生什么吗?
- python - 通过 Homebrew 安装时,IPython 不会读取 PYTHONPATH
- vba - 需要在同一个Access表中创建一条记录的副本,然后更新数据
- php - php数组在两个数组之间交换键值
- sql - 从 SQL Server 中具有公共 ID 的多条记录中选择数据
- php - 如何将输入显示为列表?
- swift - 像Instagram这样的图像滑块?
- mysql - Laravel 查询连接不为空