Почему этот код создает объект, но по-прежнему считает его неопределенным?

Я не понимаю, почему этот код не работает должным образом:

"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 Dima Parzhitsky    schedule 17.04.2020    source источник
comment
Нет, оценка оператора = выполняется слева направо, как и для всех других операторов. Да, это сбивает с толку, когда правая сторона меняет то, на что ссылается левая :-)   -  person Bergi    schedule 17.04.2020
comment
@vatz88 Да, спасибо   -  person Dima Parzhitsky    schedule 17.04.2020


Ответы (1)


Я был неправ. Это должно вызвать исключение даже до оценки rhs. Это ошибка (или, по крайней мере, отклонение от спецификации) в движке. См. https://es.discourse.group/t/rhs-evaluation-in-assignment-to-unresolvable-reference/310.


Это как это работает:

  1. Левая сторона оценивается как ссылка
  2. Правая часть оценивается как значение
  3. Значение вводится в ссылку, который выдает ошибку, если ссылка не может разрешить свое базовое значение

Я не знаю, почему они не удосужились проверить ссылку перед оценкой правой стороны, однако такое поведение согласуется с выбрасыванием свойства setter.

person Bergi    schedule 17.04.2020
comment
Спасибо за обновление! Несоответствие спецификации, это очень интересно - person Dima Parzhitsky; 24.04.2020