Встроенные функциональные объекты (built-in function objects), определенные в этой спецификации, могут быть реализованы либо как функциональные объекты ECMAScript (10.2), поведение которых обеспечивается с использованием кода ECMAScript, либо как экзотические объекты функций, обеспечиваемые реализацией, поведение которых обеспечивается каким-либо другим способом. В любом случае эффект от вызова таких функций должен соответствовать их спецификациям. Реализация также может предоставлять дополнительные встроенные функциональные объекты, которые не определены в этой спецификации.
Если встроенный функциональный объект реализован как экзотический объект, он должен иметь поведение обычного объекта, указанное в 10.1. Все такие экзотические объекты функций также имеют внутренние слоты [[Prototype]], [[Extensible]] и [[Realm]].
Если не указано иное, каждый встроенный объект функции имеет объект %Function.prototype% в качестве начального значения его внутреннего слота [[Prototype]].
Поведение, указанное для каждой встроенной функции с помощью шагов алгоритма или других средств, является спецификацией поведения тела функции для обоих вызовов функции [[Call]] и [[Construct]]. Однако вызов [[Construct]] поддерживается не всеми встроенными функциями. Для каждой встроенной функции при вызове с помощью [[Call]] [[Call]] thisArgument предоставляет значение this, [[Call]] argumentsList предоставляет именованные параметры, а значение NewTarget не определено — является undefined. При вызове с помощью [[Construct]] значение this не инициализируется, список аргументов argumentsList [[Construct]] предоставляет именованные параметры, а параметр [[Construct]] newTarget предоставляет значение NewTarget. Если встроенная функция реализована как объект функции ECMAScript, то это указанное поведение должно быть реализовано кодом ECMAScript, который является телом функции. Встроенные функции, которые являются объектами функций ECMAScript, должны быть строгими функциями. Если встроенный конструктор имеет какое-либо поведение [[Call]], кроме генерирования исключения TypeError, реализация функции ECMAScript должна выполняться таким образом, чтобы внутренний слот функции [[IsClassConstructor]] не имел значения истины true.
Встроенные функциональные объекты (built-in function objects), которые не определены как конструкторы, не реализуют внутренний метод [[Construct]], если иное не указано в описании конкретной функции. Когда встроенный конструктор вызывается как часть выражения new
, параметр argumentsList вызываемого внутреннего метода [[Construct]] предоставляет значения для именованных параметров встроенного конструктора.
Встроенные функции, не являющиеся конструкторами, не имеют свойства «prototype«, если иное не указано в описании конкретной функции.
Встроенные функции имеют внутренний слот [[InitialName]].
Если встроенный функциональный объект не реализован как функция ECMAScript, он должен предоставлять внутренние методы [[Call]] и [[Construct]], которые соответствуют следующим определениям:
- [[Call]] ( thisArgument, argumentsList )
- [[Construct]] ( argumentsList, newTarget )
- CreateBuiltinFunction ( steps, length, name, internalSlotsList [ , realm [ , prototype [ , prefix ] ] ] )
[[Call]] ( thisArgument, argumentsList )
Внутренний метод [[Call]] встроенного функционального объекта F принимает аргументы thisArgument (значение языка ECMAScript) и argumentsList (список значений языка ECMAScript). При вызове он выполняет следующие шаги:
1. Пусть callerContext будет текущим контекстом выполнения. 2. Если callerContext еще не приостановлен, приостановите callerContext. 3. Пусть calleeContext будет новым контекстом выполнения. 4. Установите для функции calleeContext значение F. 5. Пусть calleeRealm будет F.[[Realm]]. 6. Установите для области calleeContext значение calleeRealm. 7. Установите для ScriptOrModule из calleeContext значение null. 8. Выполните любую необходимую инициализацию вызываемого контекста calleeContext, определяемую реализацией. 9. Поместите calleeContext в стек контекста выполнения; calleeContext теперь является текущим контекстом выполнения. 10. Пусть result будет записью завершения, которая является результатом оценки F способом, который соответствует спецификации F.thisArgument - это значение this, argumentsList предоставляет именованные параметры, а значение NewTarget не определено - является undefined. 11. Удалите calleeContext из стека контекста выполнения и восстановите callerContext как текущий контекст выполнения. 12. Вернуть result.
Когда calleeContext удаляется из стека контекста выполнения, он не должен быть уничтожен, если он был приостановлен и сохранен доступным объектом-генератором для последующего возобновления.
[[Construct]] ( argumentsList, newTarget )
Внутренний метод [[Construct]] встроенного функционального объекта F принимает аргументы argumentsList (Список значений языка ECMAScript) и newTarget (конструктор). Выполняемые шаги такие же, как [[Call]] (см. 10.3.1), за исключением того, что шаг 10 заменен на:
10. Пусть result будет записью завершения, которая является результатом оценки F способом, который соответствует спецификации F. Значение this не инициализировано, argumentsList предоставляет именованные параметры, а newTarget предоставляет значение NewTarget.
CreateBuiltinFunction ( steps, length, name, internalSlotsList [ , realm [ , prototype [ , prefix ] ] ] )
Абстрактная операция CreateBuiltinFunction (Создать встроенную функцию) принимает аргументы, steps, length, name и internalSlotsList (Список имен внутренних слотов), а также необязательные аргументы realm, prototype и prefix. internalSlotsList содержит имена дополнительных внутренних слотов, которые должны быть определены как часть объекта. Эта операция создает встроенный объект функции. При вызове он выполняет следующие шаги:
1. Утверждено: steps - это либо набор шагов алгоритма, либо другое определение поведения функции, представленное в этой спецификации. 2. Если область realm отсутствует или область realm является пустой (empty), установите для области realm текущую запись области. 3. Утверждено: realm - это Запись Области. 4. Если prototype отсутствует, установите для prototype значение realm.[[Intrinsics]].[[%Function.prototype%]]. 5. Пусть func будет новым встроенным функциональным объектом, который при вызове выполняет действие, описанное шагами steps. Новый объект функции имеет внутренние слоты, имена которых являются элементами internalSlotsList, и внутренний слот [[InitialName]]. 6. Установить для func.[[Realm]] значение realm. 7. Установить для func.[[Prototype]] значение prototype. 8. Установить для func.[[Extensible]] значение true. 9. Установить для func.[[InitialName]] значение null. 10. Выполнить ! SetFunctionLength(func, length). 11. Если префикса prefix нет, то а. Выполнить ! SetFunctionName(func, name). 12. Иначе, а. Выполнить ! SetFunctionName(func, name, prefix). 13. Вернуть func.
Каждая встроенная функция, определенная в этой спецификации, создается путем вызова абстрактной операции CreateBuiltinFunction.
Информационные ссылки
Предыдущий раздел — Функциональные объекты ECMAScript
Стандарт ECMAScript — Раздел «Built-in Function Objects» — https://tc39.es/ecma262/#sec-built-in-function-objects