Алгоритм Array имеет сбой? - PullRequest
1 голос
/ 26 марта 2019

Вопрос касается алгоритма конструктора Array.https://tc39.github.io/ecma262/#sec-array-constructor-array

Результат алгоритма не совсем ясен:

Если NewTarget не определен, пусть newTarget будет активным функциональным объектом, иначе пусть newTarget будет NewTarget.

Это относится к случаю, когда мы вызываем этот конструктор как функцию и объект активной функции равен null (это null , когда мы вызываем его из-под Script или Module).

Перейти к строке:

Пусть прото будет?GetPrototypeFromConstructor (newTarget, "% ArrayPrototype%").

Перейдите к алгоритму GetPrototypeFromConstructor и найдите следующее:

Утверждение: IsCallable (конструктор) имеет значение true.

Не может быть null , так как null не вызывается.

Мы делаемодин из выводов:

  1. Мы что-то неправильно поняли.
  2. Ошибка спецификации

Что здесь не так?

1 Ответ

4 голосов
/ 26 марта 2019

Этот запутанный бит о том, что NewTarget, я думаю, является ключом к головоломке.Это правило в основном означает:

  • Если Array вызывается как простая функция, тогда значение newTarget является конструктором Array
  • Если Arrayвызывается как new Array, тогда значение newTarget также является конструктором Array

Почему?Хорошо, когда вызывается операция [[Construct]], второй аргумент дает newTarget.Вызовы операции [[Construct]] передают саму функцию конструктора в качестве этого аргумента.Однако простой вызов Array не включает эту операцию;это просто равнина [[Call]].Таким образом, в этом случае NewTarget - это undefined, и поэтому правило гласит, что newTarget - это «контекст активной функции».Поскольку мы говорим о том, что происходит в конструкторе Array, очевидно, что активная функция является контекстом этой функции;иначе зачем нам читать эту главу спецификации?

Почему это так сформулировано?Понятия не имею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...