Понимание ECIAScript ReturnIfAbrupt (AbstractOperation ()) - PullRequest
0 голосов
/ 10 сентября 2018

Я знаю, что есть несколько сообщений об этом, но мне еще предстоит найти хорошее объяснение того, к чему относится выражение ReturnIfAbrupt(AbstractOperation()), когда AbstractOperation() не является внезапным завершением ?

Согласно ECMAScript ReturnIfAbrupt (AbstractOperation ()) означает:

  1. Пусть hygienicTemp будет AbstractOperation ().
  2. Если hygienicTemp является неожиданным завершением, вернуть hygienicTemp.
  3. Иначе, если hygienicTemp является записью завершения, установите для hygienicTemp значение hygienicTemp. [[Value]].

Где hygienicTemp является эфемерным и видимым только в шагах, относящихся к ReturnIfAbrupt.

Взяв в качестве примера последнюю строку в операции [[Construct]] :

  1. Эта строка Return ? envRec.GetThisBinding()
  2. Что эквивалентно : Return ReturnIfAbrupt(envRec.GetThisBinding())
  3. Предполагая, что GetThisBinding() не выбрасывает Error (т. Е. Нет внезапное завершение ), я понятия не имею, что на самом деле возвращается
  4. В приведенном выше определении ReturnIfAbrupt конкретно говорится, что hygenicTemp относится только к шагам в самом определении. Это не дает никакого намека на то, что выражение в целом оценивает

1 Ответ

0 голосов
/ 10 сентября 2018

Бит, который вы указали, используется, когда значение не используется . Но ваш [[Construct]] пример равен с использованием значения.

Для этого вам нужно немного прокрутить вниз:

Шаги алгоритмов, которые говорят или иным образом эквивалентны:

  1. Пусть результат будет AbstractOperation (ReturnIfAbrupt (аргумент)).

означает то же самое, что и:

  1. Если аргумент является неожиданным завершением, вернуть аргумент.

  2. Если аргумент является записью завершения, установите аргумент в качестве аргумента. [[Value]].

  3. Пусть результат будет AbstractOperation (аргумент).

Таким образом, для Return ? envRec.GetThisBinding(), когда envRec.GetThisBinding() не возвращает внезапное завершение, эта строка в [[Construct]] возвращает [[Value]] записи не прерывистого завершения из envRec.GetThisBinding() (значение this) .

...