«Запуск контекста выполнения» в обработчиках обещаний выражения ожидания абстрактного закрытия в соответствии со спецификацией

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

Раздел 6.2.3.1 описывает это. По сути, создается обещание, которое преобразуется в ожидаемое выражение. Затем к обещанию добавляются разрешающие обработчики через .then; Обработчик выполнения — это объект функции, созданный из абстрактного замыкания, которое захватывает asyncContext , который является контекстом выполнения, связанным с асинхронной функцией. Это абстрактное замыкание приостанавливает текущий контекст выполнения и восстанавливает asyncContext в качестве текущего контекста выполнения.

Я не понимаю: когда вызывается это абстрактное закрытие, разве контекст выполнения, связанный с самим собой, не является текущим контекстом выполнения? Не приостановится ли тогда это абстрактное замыкание? Я так думаю, потому что .then [27.2.5.4.1 PerformPromiseThen] создает задания через 27.2.2.1 NewPromiseReactionJob , который создает абстрактное замыкание, использующее 9.5.3 HostCallJobCallback для вызова обработчика, который, в свою очередь, должен выполнить 7.3.14 Call для него, что приводит к вызов внутреннего метода [[Call]] объекта функции (10.2.1). Это помещает новый контекст выполнения в стек.

Что я неправильно понимаю? На что на самом деле ссылается prevContext в 6.2.3.1?

1 ответ

Ваша проблема может заключаться в том, что существует контекст выполнения, «связанный» с абстрактным замыканием. Спецификация немного уклончива в этом вопросе, но я думаю, что легче понять такие примеры, как ваш, если вы представляете алгоритмы спецификации (включая абстрактные замыкания) как работающие «вне» любого контекста выполнения. Затем это позволяет алгоритмам спецификаций приостанавливать/возобновлять/проталкивать/извлекать контексты выполнения без какого-либо влияния на выполнение этих алгоритмов.

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