Спецификация ECMAScript 5.1 с аннотациями

Поделиться
← 15.2 Объекты Object Содержание15.4 Объекты Array →
    1. 15.3 Объекты Function
      1. 15.3.1 Вызов конструктора Function как функции
        1. 15.3.1.1 Function (p1, p2, … , pn, body)
      2. 15.3.2 Конструктор Function
        1. 15.3.2.1 new Function (p1, p2, … , pn, body)
      3. 15.3.3 Свойства конструктора Function
        1. 15.3.3.1 Function.prototype
        2. 15.3.3.2 Function.length
      4. 15.3.4 Свойства объекта-прототипа Function
        1. 15.3.4.1 Function.prototype.constructor
        2. 15.3.4.2 Function.prototype.toString ( )
        3. 15.3.4.3 Function.prototype.apply (thisArg, argArray)
        4. 15.3.4.4 Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )
        5. 15.3.4.5 Function.prototype.bind (thisArg [, arg1 [, arg2, …]])
          1. 15.3.4.5.1 [[Call]]
          2. 15.3.4.5.2 [[Construct]]
          3. 15.3.4.5.3 [[HasInstance]] (V)
      5. 15.3.5 Свойства экземпляров Function
        1. 15.3.5.1 length
        2. 15.3.5.2 prototype
        3. 15.3.5.3 [[HasInstance]] (V)
        4. 15.3.5.4 [[Get]] (P)

15.3 Объекты Function #

15.3.1 Вызов конструктора Function как функции #

При вызове Function не в качестве конструктора, а в качестве функции, создается и инициализируется новый объект Function. Таким образом, вызов функции Function() эквивалентен выражению для создания объекта new Function() с теми же аргументами.

15.3.1.1 Function (p1, p2, … , pn, body) #

При вызове функции Function с аргументами p1, p2, … , pn, body (где n может быть равно 0, что означает отсутствие аргументов “p”, и где аргумент body также может быть не передан) выполняются следующие шаги:

  1. Создать и вернуть новый объект Function, как если бы этот стандартный встроенный конструктор Function был использован в выражении new с такими же аргументами (15.3.2.1).

15.3.2 Конструктор Function #

Если Function вызывается как часть выражения new, он является конструктором, так как он инициализирует созданный объект.

15.3.2.1 new Function (p1, p2, … , pn, body) #

Последний аргумент указывает тело (исполняемый код) функции, а все предыдущие аргументы указывают формальные параметры.

При вызове конструктора Function с аргументами p1, p2, … , pn, body (где n может быть равно 0, что означает отсутствие аргументов “p”, и где аргумент body также может быть не передан) выполняются следующие шаги:

  1. Пусть argCount будет общим количеством параметров, переданных при вызове этой функции.

  2. Пусть P будет пустой строкой.

  3. Если argCount = 0, пусть body будет пустой строкой.

  4. Иначе, если argCount = 1, пусть body будет этим аргументом.

  5. Иначе, argCount > 1

    1. Пусть firstArg будет первым аргументом.

    2. Пусть P будет ToString(firstArg).

    3. Пусть k будет 2.

    4. Повторить, пока k < argCount

      1. Пусть nextArg будет k-тым аргументом.

      2. Пусть P будет результатом конкатенации предыдущего значения P, строки "," (запятая) и ToString(nextArg).

      3. Увеличить k на 1.

    5. Пусть body будет k-тым аргументом.

  6. Пусть body будет ToString(body).

  7. Если P не может подвергнуться синтаксическому разбору как FormalParameterListopt, сгенерировать исключение SyntaxError.

  8. Если body не может подвергнуться синтаксическому разбору как FunctionBody, сгенерировать исключение SyntaxError.

  9. Если body код в строгом режиме (см. пункт 10.1.1), то пусть strict будет true, иначе пусть strict будет false.

  10. Если strict равно true, сгенерировать все применимые исключения, описанные в пункте 13.1.

  11. Вернуть новый объект 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")

15.3.3 Свойства конструктора Function #

Конструктор Function является объектом Function, а его [[Class]] равен "Function". Значением внутреннего свойства [[Prototype]] конструктора Function является стандартный встроенный объект-прототип Function (15.3.4).

Значение внутреннего свойства [[Extensible]] конструктора Function равно true.

Конструктор Function обладает следующими свойствами:

15.3.3.1 Function.prototype #

Начальным значением Function.prototype является стандартный встроенный объект-прототип Function (15.3.4).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.3.3.2 Function.length #

Это свойство данных, его значение равно 1. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.3.4 Свойства объекта-прототипа Function #

Объект-прототип Function представляет собой объект Function (его [[Class]] равен "Function"), который при его вызове принимает любые аргументы и возвращает undefined.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Function является стандартный встроенный объект-прототип Object (15.2.4). Начальное значение внутреннего свойства [[Extensible]] объекта-прототипа Function равно true.

Объект-прототип Function не имеет собственного свойства valueOf, но он наследует свойство valueOf от объекта-прототипа Object.

Свойство length объекта-прототипа Function равно 0.

15.3.4.1 Function.prototype.constructor #

Начальным значением Function.prototype.constructor является встроенный конструктор Function.

15.3.4.2 Function.prototype.toString ( ) #

Возвращается зависящее от реализации представление функции, которое имеет синтаксис FunctionDeclaration. В частности, обратите внимание, что использование и расстановка пробелов, символов окончания строки и точек с запятой в строковом представлении зависит от реализации.

Функция toString не является родовой функцией. Если её значение this – не объект Function, она генерирует исключение TypeError. Поэтому она не может передаваться другим типам объектов для использования в качестве метода.

15.3.4.3 Function.prototype.apply (thisArg, argArray) #

При вызове методом apply объекта func с агрументами thisArg и argArray выполняются следующие шаги:

  1. Если IsCallable(func) – false, сгенерировать исключение TypeError.

  2. Если argArraynull или undefined, то

    1. Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и пустой список аргументов.

  3. Если Type(argArray) – не Object, сгенерировать исключение TypeError.

  4. Пусть len будет результатом вызова внутреннего метода [[Get]] для argArray с аргументом "length".

  5. Пусть n будет ToUint32(len).

  6. Пусть argList будет пустым списком List.

  7. Пусть index будет 0.

  8. Повторить, пока index < n

    1. Пусть indexName будет ToString(index).

    2. Пусть nextArg будет результатом вызова внутреннего метода [[Get]] для argArray с передачей indexName в качестве аргумента.

    3. Присоедините nextArg в качестве последнего элемента argList.

    4. Присвойте index значение index + 1.

  9. Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и argList в качестве списка аргументов.

Свойство length для метода apply равно 2.

ПРИМЕЧАНИЕ Значение thisArg передаётся без изменения как значение this. Это отличие от 3-й редакции, в которой thisArg, равное undefined или null, заменяется глобальным объектом, а ToObject применяется ко всем другим значениям, и этот результат передаётся в качестве значения this.

15.3.4.4 Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] ) #

При вызове методом call объекта func с аргументом thisArg и необязательными аргументами arg1, arg2, и т.д.,выполняются следующие шаги:

  1. Если IsCallable(func) – false, сгенерировать исключение TypeError.

  2. Пусть argList будет пустым списком List.

  3. Если данный метод вызывался более чем с одним аргументом, то слева направо, начиная с аргумента arg1, присоединить каждый аргумент как последний элемент argList.

  4. Вернуть результат вызова внутреннего метода [[Call]] для func, передавая thisArg в качестве значения this и argList в качестве списка аргументов.

Свойство length для метода call равно 1.

ПРИМЕЧАНИЕ Значение thisArg передаётся без изменения как значение this. Это отличие от 3-й редакции, в которой thisArg, равное undefined или null, заменяется глобальным объектом, а ToObject применяется ко всем другим значениям, и этот результат передаётся в качестве значения this.

15.3.4.5 Function.prototype.bind (thisArg [, arg1 [, arg2, …]]) #

Метод bind принимает один или несколько аргументов, thisArg и необязательные аргументы arg1, arg2, и т.д., и возвращает новый объект function, выполняя при этом следующие шаги:

  1. Пусть Target будет значением this.

  2. Если IsCallable(Target) – false, сгенерировать исключение TypeError.

  3. Пусть A будет новым (возможно, пустым) внутренним списком всех значений аргументов, передаваемых после thisArg (arg1, arg2, и т.д.), по порядку.

  4. Пусть F будет новым родным объектом ECMAScript.

  5. Установить все внутренние методы для F, кроме метода [[Get]], как указано в пункте 8.12.

  6. Установить внутреннее свойство [[Get]] для F, как указано в пункте 15.3.5.4.

  7. Присвоить внутреннему свойству [[TargetFunction]] для F значение Target.

  8. Присвоить внутреннему свойству [[BoundThis]] для F значение thisArg.

  9. Присвоить внутреннему свойству [[BoundArgs]] для F значение A.

  10. Внутреннему свойству [[Class]] для F присвоить "Function".

  11. Присвоить внутреннему свойству [[Prototype]] для F значение стандартного встроенного объекта-прототипа Function, как описано в пункте 15.3.3.1.

  12. Установить внутреннее свойство [[Call]] для F, как описано в пункте 15.3.4.5.1.

  13. Установить внутреннее свойство [[Construct]] для F, как описано в пункте 15.3.4.5.2.

  14. Установить внутреннее свойство [[HasInstance]] для F, как описано в пункте 15.3.4.5.3.

  15. Если внутреннее свойство [[Class]] для Target равно "Function", то

    1. Пусть L будет свойством length для Target, минус длина A.

    2. Присвоить собственному свойству length для F значение 0 или L (то из них, которое больше).

  16. Иначе, присвоить собственному свойству length для F на 0.

  17. Присвоить атрибутам собственного свойства length для F значения, указанные в пункте 15.3.5.1.

  18. Присвоить внутреннему свойству [[Extensible]] для F значение true.

  19. Пусть thrower будет объектом функции [[ThrowTypeError]] (13.2.3).

  20. Вызвать внутренний метод [[DefineOwnProperty]] для F с аргументами "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false} и false.

  21. Вызвать внутренний метод [[DefineOwnProperty]] для F с аргументами "arguments", PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false} и false.

  22. Вернуть F.

Свойство length для метода bind равно 1.

ПРИМЕЧАНИЕ У объектов Function, созданных посредством Function.prototype.bind, отсутствует свойство prototype или внутренние свойства [[Code]], [[FormalParameters]] и [[Scope]].

15.3.4.5.1 [[Call]] #

При вызове внутреннего метода [[Call]] для F (объекта Function, созданного посредством функции bind) со значением this и списком аргументов ExtraArgs выполняются следующие шаги:

  1. Пусть boundArgs будет значением внутреннего свойства [[BoundArgs]] для F.

  2. Пусть boundThis будет значением внутреннего свойства [[BoundThis]] для F.

  3. Пусть target будет значением внутреннего свойства [[TargetFunction]] для F.

  4. Пусть args будет новым списком, содержащим такие же значения, что и список boundArgs, в том же порядке, за которым следуют такие же значения, что и в списке ExtraArgs, в том же порядке.

  5. Вернуть результат вызова внутреннего метода [[Call]] для target, передавая boundThis в качестве значения this и передавая args в качестве аргументов.

15.3.4.5.2 [[Construct]] #

При вызове внутреннего метода [[Construct]] для F (объекта Function, созданного посредством функции bind) со списком аргументов ExtraArgs выполняются следующие шаги:

  1. Пусть target будет значением внутреннего свойства [[TargetFunction]] для F.

  2. Если у target отсутствует внутренний метод [[Construct]], сгенерировать исключение TypeError.

  3. Пусть boundArgs будет значением внутреннего свойства [[BoundArgs]] для F.

  4. Пусть args будет новым списком, содержащим такие же значения, что и список boundArgs, в том же порядке, за которым следуют такие же значения, что и в списке ExtraArgs, в том же порядке.

  5. Вернуть результат вызова внутреннего метода [[Construct]] для target, передавая args в качестве аргументов.

15.3.4.5.3 [[HasInstance]] (V) #

При вызове внутреннего метода [[HasInstance]] для F (объекта Function, созданного посредством функции bind) с аргументом V выполняются следующие шаги:

  1. Пусть target будет значением внутреннего свойства [[TargetFunction]] для F.

  2. Если у target отсутствует внутренний метод [[HasInstance]], сгенерировать исключение TypeError.

  3. Вернуть результат вызова внутреннего метода [[HasInstance]] для target, передавая V в качестве аргумента.

15.3.5 Свойства экземпляров Function #

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

15.3.5.1 length #

Значение свойства length представляет собой целое число, означающее "типичное" количество аргументов, ожидаемых функцией. Однако в ECMAScript возможен вызов функции и с другим количеством аргументов. Поведение функции при её вызове с аргументами, количество которых отличается от количества, заданного свойством length, зависит от этой функции. Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.3.5.2 prototype #

Значение свойства prototype используется для инициализации внутреннего свойства [[Prototype]] нового объекта перед тем, как для этого нового объекта будет вызван объект Function в качестве конструктора. Это свойство имеет атрибут { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.

ПРИМЕЧАНИЕ У объектов Function, созданных посредством Function.prototype.bind, отсутствует свойство prototype.

15.3.5.3 [[HasInstance]] (V) #

Допустим, что F – объект Function.

При вызове внутреннего метода [[HasInstance]] для F со значением V выполняются следующие шаги:

  1. Если V – не объект, вернуть false.

  2. Пусть O будет результатом вызова внутреннего метода [[Get]] для F с именем свойства "prototype".

  3. Если Type(O) – не Object, сгенерировать исключение TypeError.

  4. Повторить

    1. Пусть V будет значением внутреннего свойства [[Prototype]] для V.

    2. Если Vnull, вернуть false.

    3. Если O и V относятся к одному и тому же объекту, вернуть true.

ПРИМЕЧАНИЕ У объектов Function, созданных посредством метода Function.prototype.bind, другая реализация внутреннего метода [[HasInstance]], описанная в пункте 15.3.4.5.3.

15.3.5.4 [[Get]] (P) #

Объекты Function используют вариацию внутреннего метода [[Get]], используемую для других родных объектов ECMAScript (см. пункт 8.12.3).

Допустим, что F – объект Function. При вызове внутреннего метода [[Get]] для F с именем свойства P выполняются следующие шаги:

  1. Пусть v будет результатом вызова внутреннего метода по умолчанию [[Get]] (8.12.3) для F с передачей P в качестве аргумента имени свойства.

  2. Если P"caller" и v – объект функции в строгом режиме, сгенерировать исключение TypeError.

  3. Вернуть v.

ПРИМЕЧАНИЕ Объекты Function, созданные посредством Function.prototype.bind, используют внутренний метод по умолчанию [[Get]].