Я не понимаю, почему этот код не работает должным образом:
"use strict";
window.obj.prop = (() => {
window.obj = { myobj: true };
return "value";
})();
Я всегда думал, что оператор =
сначала оценивает то, что находится справа от него (IIFE в этом фрагменте), а затем присваивает результат тому, что находится слева от него (window.obj.prop
в этом фрагменте). Хотя, похоже, здесь происходит что-то другое.
Если интерпретатор сначала оценивает IIFE, то он должен создать window.obj
перед установкой своего .prop
, что не должно приводить к TypeError
. С другой стороны, если интерпретатор сначала проверяет наличие prop
в window.obj
(и терпит неудачу с TypeError
, потому что window.obj
не определено), то он не должен оценивать IIFE, который не должен создавать window.obj
.
Я наблюдаю, что и window.obj
создается и TypeError
выбрасывается, что для меня не имеет смысла.
Заметки:
"use strict"
кинул "на всякий случай", без него сниппет работает аналогично;- фрагмент работает одинаково как в браузере (Chrome 80.0), так и в Node.js (v13.3);
- объект
window.obj
(илиglobal.obj
в Node) не существует до запуска этого фрагмента;
=
выполняется слева направо, как и для всех других операторов. Да, это сбивает с толку, когда правая сторона меняет то, на что ссылается левая :-) - person Bergi   schedule 17.04.2020