При вызове Function
не в качестве конструктора, а в качестве функции, создается и инициализируется новый объект Function. Таким образом, вызов функции Function(
…
)
эквивалентен выражению для создания объекта new Function(
…
)
с теми же аргументами.
При вызове функции Function
с аргументами p1, p2, … , pn, body (где n может быть равно 0, что означает отсутствие аргументов “p”, и где аргумент body также может быть не передан) выполняются следующие шаги:
Создать и вернуть новый объект Function, как если бы этот стандартный встроенный конструктор Function был использован в выражении new с такими же аргументами (15.3.2.1).
Если Function
вызывается как часть выражения new
, он является конструктором, так как он инициализирует созданный объект.
Последний аргумент указывает тело (исполняемый код) функции, а все предыдущие аргументы указывают формальные параметры.
При вызове конструктора Function
с аргументами p1, p2, … , pn, body (где n может быть равно 0, что означает отсутствие аргументов “p”, и где аргумент body также может быть не передан) выполняются следующие шаги:
Пусть argCount будет общим количеством параметров, переданных при вызове этой функции.
Пусть P будет пустой строкой.
Если argCount = 0, пусть body будет пустой строкой.
Иначе, если argCount = 1, пусть body будет этим аргументом.
Иначе, argCount > 1
Пусть firstArg будет первым аргументом.
Пусть P будет ToString(firstArg).
Пусть k будет 2.
Повторить, пока k < argCount
Пусть nextArg будет k-тым аргументом.
Пусть P будет результатом конкатенации предыдущего значения P, строки ","
(запятая) и ToString(nextArg).
Увеличить k на 1.
Пусть body будет k-тым аргументом.
Пусть body будет ToString(body).
Если P не может подвергнуться синтаксическому разбору как FormalParameterListopt, сгенерировать исключение SyntaxError.
Если body не может подвергнуться синтаксическому разбору как FunctionBody, сгенерировать исключение SyntaxError.
Если body – код в строгом режиме (см. пункт 10.1.1), то пусть strict будет true, иначе пусть strict будет false.
Если strict равно true, сгенерировать все применимые исключения, описанные в пункте 13.1.
Вернуть новый объект Function, созданный как указано в пункте 13.2, с передачей P в качестве FormalParameterList и body в качестве FunctionBody. Передать Global Environment в качестве параметра Scope, и strict в качестве флага Strict.
Для каждой функции автоматически создаётся свойство prototype
, чтобы предусмотреть возможность использования этой функции в качестве конструктора.
ПРИМЕЧАНИЕ Допустимо (но необязательно) указывать в каждом задаваемом формальном параметре только один аргумент. Например, все три приведенных ниже выражения имеют одинаковый результат:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
Конструктор Function является объектом Function, а его [[Class]] равен "Function"
. Значением внутреннего свойства [[Prototype]] конструктора Function является стандартный встроенный объект-прототип Function (15.3.4).
Значение внутреннего свойства [[Extensible]] конструктора Function равно true.
Конструктор Function обладает следующими свойствами:
Начальным значением Function.prototype
является стандартный встроенный объект-прототип Function (15.3.4).
Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Это свойство данных, его значение равно 1. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Объект-прототип Function представляет собой объект Function (его [[Class]] равен "Function"
), который при его вызове принимает любые аргументы и возвращает undefined.
Значением внутреннего свойства [[Prototype]] объекта-прототипа Function является стандартный встроенный объект-прототип Object (15.2.4). Начальное значение внутреннего свойства [[Extensible]] объекта-прототипа Function равно true.
Объект-прототип Function не имеет собственного свойства valueOf
, но он наследует свойство valueOf
от объекта-прототипа Object.
Свойство length
объекта-прототипа Function равно 0.
Начальным значением Function.prototype.constructor
является встроенный конструктор Function
.
Возвращается зависящее от реализации представление функции, которое имеет синтаксис FunctionDeclaration. В частности, обратите внимание, что использование и расстановка пробелов, символов окончания строки и точек с запятой в строковом представлении зависит от реализации.
Функция toString
не является родовой функцией. Если её значение this – не объект Function, она генерирует исключение TypeError. Поэтому она не может передаваться другим типам объектов для использования в качестве метода.
При вызове методом apply
объекта func с агрументами thisArg и argArray выполняются следующие шаги:
Если IsCallable(func) – false, сгенерировать исключение TypeError.
Если argArray – null или undefined, то
Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и пустой список аргументов.
Если Type(argArray) – не Object, сгенерировать исключение TypeError.
Пусть len будет результатом вызова внутреннего метода [[Get]] для argArray с аргументом "length
".
Пусть n будет ToUint32(len).
Пусть argList будет пустым списком List.
Пусть index будет 0.
Повторить, пока index < n
Пусть indexName будет ToString(index).
Пусть nextArg будет результатом вызова внутреннего метода [[Get]] для argArray с передачей indexName в качестве аргумента.
Присоедините nextArg в качестве последнего элемента argList.
Присвойте index значение index + 1.
Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и argList в качестве списка аргументов.
Свойство length
для метода apply
равно 2.
ПРИМЕЧАНИЕ Значение thisArg передаётся без изменения как значение this. Это отличие от 3-й редакции, в которой thisArg, равное undefined или null, заменяется глобальным объектом, а ToObject применяется ко всем другим значениям, и этот результат передаётся в качестве значения this.
При вызове методом call
объекта func с аргументом thisArg и необязательными аргументами arg1, arg2, и т.д.,выполняются следующие шаги:
Если IsCallable(func) – false, сгенерировать исключение TypeError.
Пусть argList будет пустым списком List.
Если данный метод вызывался более чем с одним аргументом, то слева направо, начиная с аргумента arg1, присоединить каждый аргумент как последний элемент argList.
Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и argList в качестве списка аргументов.
Свойство length
для метода call
равно 1.
ПРИМЕЧАНИЕ Значение thisArg передаётся без изменения как значение this. Это отличие от 3-й редакции, в которой thisArg, равное undefined или null, заменяется глобальным объектом, а ToObject применяется ко всем другим значениям, и этот результат передаётся в качестве значения this.
Метод bind принимает один или несколько аргументов, thisArg и необязательные аргументы arg1, arg2, и т.д., и возвращает новый объект function, выполняя при этом следующие шаги:
Пусть Target будет значением this.
Если IsCallable(Target) – false, сгенерировать исключение TypeError.
Пусть A будет новым (возможно, пустым) внутренним списком всех значений аргументов, передаваемых после thisArg (arg1, arg2, и т.д.), по порядку.
Пусть F будет новым родным объектом ECMAScript.
Установить все внутренние методы для F, кроме метода [[Get]], как указано в пункте 8.12.
Установить внутреннее свойство [[Get]] для F, как указано в пункте 15.3.5.4.
Присвоить внутреннему свойству [[TargetFunction]] для F значение Target.
Присвоить внутреннему свойству [[BoundThis]] для F значение thisArg.
Присвоить внутреннему свойству [[BoundArgs]] для F значение A.
Внутреннему свойству [[Class]] для F присвоить "Function".
Присвоить внутреннему свойству [[Prototype]] для F значение стандартного встроенного объекта-прототипа Function, как описано в пункте 15.3.3.1.
Установить внутреннее свойство [[Call]] для F, как описано в пункте 15.3.4.5.1.
Установить внутреннее свойство [[Construct]] для F, как описано в пункте 15.3.4.5.2.
Установить внутреннее свойство [[HasInstance]] для F, как описано в пункте 15.3.4.5.3.
Если внутреннее свойство [[Class]] для Target равно "Function", то
Пусть L будет свойством length для Target, минус длина A.
Присвоить собственному свойству length для F значение 0 или L (то из них, которое больше).
Иначе, присвоить собственному свойству length для F на 0.
Присвоить атрибутам собственного свойства length для F значения, указанные в пункте 15.3.5.1.
Присвоить внутреннему свойству [[Extensible]] для F значение true.
Пусть thrower будет объектом функции [[ThrowTypeError]] (13.2.3).
Вызвать внутренний метод [[DefineOwnProperty]] для F с аргументами "caller"
, PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false} и false.
Вызвать внутренний метод [[DefineOwnProperty]] для F с аргументами "arguments"
, PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false} и false.
Вернуть F.
Свойство length
для метода bind
равно 1.
ПРИМЕЧАНИЕ У объектов Function, созданных посредством Function.prototype.bind
, отсутствует свойство prototype
или внутренние свойства [[Code]], [[FormalParameters]] и [[Scope]].
При вызове внутреннего метода [[Call]] для F (объекта Function, созданного посредством функции bind) со значением this и списком аргументов ExtraArgs выполняются следующие шаги:
Пусть boundArgs будет значением внутреннего свойства [[BoundArgs]] для F.
Пусть boundThis будет значением внутреннего свойства [[BoundThis]] для F.
Пусть target будет значением внутреннего свойства [[TargetFunction]] для F.
Пусть args будет новым списком, содержащим такие же значения, что и список boundArgs, в том же порядке, за которым следуют такие же значения, что и в списке ExtraArgs, в том же порядке.
Вернуть результат вызова внутреннего метода [[Call]] для target, передавая boundThis в качестве значения this и передавая args в качестве аргументов.
При вызове внутреннего метода [[Construct]] для F (объекта Function, созданного посредством функции bind) со списком аргументов ExtraArgs выполняются следующие шаги:
Пусть target будет значением внутреннего свойства [[TargetFunction]] для F.
Если у target отсутствует внутренний метод [[Construct]], сгенерировать исключение TypeError.
Пусть boundArgs будет значением внутреннего свойства [[BoundArgs]] для F.
Пусть args будет новым списком, содержащим такие же значения, что и список boundArgs, в том же порядке, за которым следуют такие же значения, что и в списке ExtraArgs, в том же порядке.
Вернуть результат вызова внутреннего метода [[Construct]] для target, передавая args в качестве аргументов.
При вызове внутреннего метода [[HasInstance]] для F (объекта Function, созданного посредством функции bind) с аргументом V выполняются следующие шаги:
Пусть target будет значением внутреннего свойства [[TargetFunction]] для F.
Если у target отсутствует внутренний метод [[HasInstance]], сгенерировать исключение TypeError.
Вернуть результат вызова внутреннего метода [[HasInstance]] для target, передавая V в качестве аргумента.
Кроме обязательных внутренних свойств, каждый экземпляр function имеет внутреннее свойство [[Call]] и чаще всего использует другую версию внутреннего свойства [[Get]]. В зависимости от способа их создания (см. пункты 8.6.2 ,13.2, 15 и 15.3.4.5), экземпляры function могут иметь следующие внутренние свойства: [[HasInstance]], [[Scope]], [[Construct]], [[FormalParameters]], [[Code]], [[TargetFunction]], [[BoundThis]] и [[BoundArgs]].
Значение внутреннего свойства [[Class]] равно "Function".
У экземпляров Function, соответствующих функциям в строгом режиме (см. пункт 13.2), и у экземпляров function, созданных посредством метода Function.prototype.bind (15.3.4.5), есть свойства “caller” и “arguments”, которые генерируют исключение TypeError. Реализация ECMAScript не должна ассоциировать зависящее от реализации поведение с доступом к этим свойствам из кода функции в строгом режиме.
Значение свойства length
представляет собой целое число, означающее "типичное" количество аргументов, ожидаемых функцией. Однако в ECMAScript возможен вызов функции и с другим количеством аргументов. Поведение функции при её вызове с аргументами, количество которых отличается от количества, заданного свойством length
, зависит от этой функции. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Значение свойства prototype
используется для инициализации внутреннего свойства [[Prototype]] нового объекта перед тем, как для этого нового объекта будет вызван объект Function в качестве конструктора. Это свойство имеет атрибут { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
ПРИМЕЧАНИЕ У объектов Function, созданных посредством Function.prototype.bind
, отсутствует свойство prototype
.
Допустим, что F – объект Function.
При вызове внутреннего метода [[HasInstance]] для F со значением V выполняются следующие шаги:
Если V – не объект, вернуть false.
Пусть O будет результатом вызова внутреннего метода [[Get]] для F с именем свойства "prototype"
.
Если Type(O) – не Object, сгенерировать исключение TypeError.
Повторить
Пусть V будет значением внутреннего свойства [[Prototype]] для V.
Если V – null, вернуть false.
Если O и V относятся к одному и тому же объекту, вернуть true.
ПРИМЕЧАНИЕ У объектов Function, созданных посредством метода Function.prototype.bind
, другая реализация внутреннего метода [[HasInstance]], описанная в пункте 15.3.4.5.3.
Объекты Function используют вариацию внутреннего метода [[Get]], используемую для других родных объектов ECMAScript (см. пункт 8.12.3).
Допустим, что F – объект Function. При вызове внутреннего метода [[Get]] для F с именем свойства P выполняются следующие шаги:
Пусть v будет результатом вызова внутреннего метода по умолчанию [[Get]] (8.12.3) для F с передачей P в качестве аргумента имени свойства.
Если P – "caller"
и v – объект функции в строгом режиме, сгенерировать исключение TypeError.
Вернуть v.
ПРИМЕЧАНИЕ Объекты Function, созданные посредством Function.prototype.bind
, используют внутренний метод по умолчанию [[Get]].