Понимание ECMAScript ReturnIfAbrupt(AbstractOperation())

Я знаю, что есть несколько сообщений об этом, но мне еще предстоит найти хорошее объяснение того, что оценивает оператор 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 относится только к шагам внутри самого определения. Это не дает намека на то, что выражение в целом оценивается как

person Magnus    schedule 10.09.2018    source источник
comment
Если я правильно понимаю, это означает, что запись завершения разворачивается и возвращается ее [[Value]].   -  person Felix Kling    schedule 10.09.2018
comment
Спасибо @FelixKling. Это было и моим подозрением, но я не смог найти никаких доказательств, подтверждающих этот вывод в определении спецификации ReturnIfAbrupt. По сути, он говорит, что hygenicTemp эфемерен и недоступен вне определения. Таким образом, я чувствовал, что это было просто предположение.   -  person Magnus    schedule 10.09.2018
comment
Раньше это было так просто: ecma-international.org/ ecma-262/6.0/#sec-returnifabrupt . Таким образом, это было бы эквивалентно: arg = <some operation>; if (IsAbrupt(arg)) { return arg; } else { arg = arg.[[Value]]};, если это имеет смысл.   -  person Felix Kling    schedule 10.09.2018


Ответы (1)


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

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

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

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

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

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

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

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

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

person T.J. Crowder    schedule 10.09.2018
comment
Я не уверен, что часть, которую вы цитируете, применима здесь. Эта строка в [[Construct]] не передает результат ReturnIfAbrupt(argument) другой операции. Но, может быть, Return считается здесь операцией, так что это эквивалентно? - person Felix Kling; 10.09.2018
comment
@FelixKling - Да, Return использует значение, поэтому применяется эта часть, а не часть, указанная в вопросе. Возврат ? envRec.GetThisBinding() — это просто более короткий способ написать Let X be ? envRec.GetThisBinding(), а затем верните X. - person T.J. Crowder; 10.09.2018
comment
Facepalm, я как-то пропустил эту часть. Это именно то, что я искал, спасибо TJ. @FelixKling, он говорит Algorithms steps that say or are otherwise equivalent to:..., а Return ReturnIfAbrupt(op) возвращает все, что оценивает ReturnIfAbrupt(op) (при отсутствии abrupt completion). Насколько я понимаю, последняя строка соответствует этому определению. - person Magnus; 10.09.2018