IIFE, модули и JS

Я пытаюсь понять код:

(function (exports) {

 exports.myProperty = "azerty";

 console.log(exports)

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

Что я понял из этого кода:

1) Я выполняю IIFE, и «это» представляет собой окно (глобальный объект).

2) Поскольку у Window нет свойства myModule, this.myModule = this.myModule добавляет новое свойство к объекту Window, и это свойство не определено.

3) (this.myModule=this.myModule) || {} возвращает {}, поэтому экспорт равен {} (пустой объект)

4) Я добавляю свойство "myProperty" для экспорта объекта, поэтому export = {myProerty: "azerty"}

Чего я не понимаю: после выполнения этого кода, когда я console.log(окно), я вижу, что:

введите здесь описание изображения

Объект Window имеет свойство myModule, равное объекту экспорта. Как была разрешена связь между myModule и {myProperty: "azerty"}? Я не могу понять эту часть.


person AntonBoarf    schedule 12.06.2018    source источник
comment
this.myModule = this.myModule || {} это this.myModule = (this.myModule || {}), а не (this.myModule = this.myModule) || {}.   -  person Ry-♦    schedule 12.06.2018
comment
Объекты являются значениями ссылочного типа и могут изменяться. Объект, переданный как exports, также назначается this.myModule в this.myModule = this.myModule || {}.   -  person Felix Kling    schedule 12.06.2018
comment
@Ry: спасибо. Я это только что понял ;)   -  person AntonBoarf    schedule 12.06.2018


Ответы (1)


Ваш номер 3 неверен. Скобки в исходном коде выглядят так:

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

и оценивается так:

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

Если создается новый пустой объект, он сразу присваивается this.module, прежде чем будет назначен exports через аргумент функции. Таким образом, window.myModule и exports являются ссылками на один и тот же объект.

person Paul    schedule 12.06.2018
comment
Да, как сказал ранее Рай, ты прав. не видел этого - person AntonBoarf; 13.06.2018