Я знаю, что есть несколько сообщений об этом, но мне еще предстоит найти хорошее объяснение того, что оценивает оператор ReturnIfAbrupt(AbstractOperation())
, когда AbstractOperation()
не является резкое завершение?
В соответствии с ECMAScript ReturnIfAbrupt(AbstractOperation()) означает :
- Пусть hygienicTemp будет AbstractOperation().
- Если hygienicTemp является внезапным завершением, верните hygienicTemp.
- В противном случае, если hygienicTemp является записью завершения, установите для hygienicTemp значение hygienicTemp.[[Value]].
Где hygienicTemp является эфемерным и отображается только в шагах, относящихся к ReturnIfAbrupt.
Взяв последнюю строку в [[Construct]] операция в качестве примера:
- Эта строка
Return ? envRec.GetThisBinding()
- Что эквивалентно:
Return ReturnIfAbrupt(envRec.GetThisBinding())
- Предполагая, что
GetThisBinding()
не выдаетError
(т.е. нет резкого завершения), я понятия не имею, что на самом деле возвращается - Процитированное выше определение
ReturnIfAbrupt
конкретно говорит, чтоhygenicTemp
относится только к шагам внутри самого определения. Это не дает намека на то, что выражение в целом оценивается как
[[Value]]
. - person Felix Kling   schedule 10.09.2018ReturnIfAbrupt
. По сути, он говорит, чтоhygenicTemp
эфемерен и недоступен вне определения. Таким образом, я чувствовал, что это было просто предположение. - person Magnus   schedule 10.09.2018arg = <some operation>; if (IsAbrupt(arg)) { return arg; } else { arg = arg.[[Value]]};
, если это имеет смысл. - person Felix Kling   schedule 10.09.2018