Понимание returnifabrupt (abstractoperation ()) в ecmascript

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

According to ECMAScriptReturnIfAbrupt(AbstractOperation()) means:

  1. Let hygienicTemp be AbstractOperation().
  2. If hygienicTemp is an abrupt completion, return hygienicTemp.
  3. Else if hygienicTemp is a Completion Record, set hygienicTemp to hygienicTemp.[[Value]].

Where hygienicTemp is ephemeral and visible only in the steps pertaining to ReturnIfAbrupt.

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

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

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

Felix Kling 10.09.2018 10:24

Спасибо @FelixKling. Это тоже было моим подозрением, но я не смог найти никаких доказательств, подтверждающих этот вывод, в определении ReturnIfAbrupt, приведенном в спецификации. По сути, он говорит, что hygenicTemp недолговечен и недоступен вне определения. Таким образом, я чувствовал, что это всего лишь предположение.

Magnus 10.09.2018 10:27

Раньше это было так просто: ecma-international.org/ecma-262/6.0/#sec-returnifabrupt. Таким образом, это было бы эквивалентно: arg = <some operation>; if (IsAbrupt(arg)) { return arg; } else { arg = arg.[[Value]]};, если это имеет смысл.

Felix Kling 10.09.2018 10:28
1
3
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Algorithms steps that say or are otherwise equivalent to:

  1. Let result be AbstractOperation(ReturnIfAbrupt(argument)).

mean the same thing as:

  1. If argument is an abrupt completion, return argument.

  2. If argument is a Completion Record, set argument to argument.[[Value]].

  3. Let result be AbstractOperation(argument).

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

Я не уверен, что процитированная вами часть применима здесь. Эта строка в [[Construct]] не передает "результат" ReturnIfAbrupt(argument) другой операции. Но, может быть, Return здесь считается операцией, так что это «эквивалент»?

Felix Kling 10.09.2018 10:32

@FelixKling - Да, Return использует значение, поэтому применяется эта часть, а не часть, указанная в вопросе. «Return? EnvRec.GetThisBinding ()» - это просто более короткий способ написать «Пусть X будет? EnvRec.GetThisBinding ()», а затем «Вернуть X».

T.J. Crowder 10.09.2018 10:36

Facepalm, я как-то пропустил ту часть. Это именно то, что я искал, спасибо TJ. @FelixKling, он говорит Algorithms steps that say or are otherwise equivalent to:..., а Return ReturnIfAbrupt(op) возвращает то, что оценивает ReturnIfAbrupt(op) (без abrupt completion). Итак, насколько я понимаю, этим определением улавливается последняя строчка.

Magnus 10.09.2018 10:36

Другие вопросы по теме