这个问题与数组构造函数算法有关。 https://tc39.github.io/ecma262/#sec-array-constructor-array
该算法的结果不太清楚:
如果未定义 NewTarget,则让 newTarget
- 成为活动函数对象,否则让 newTarget 为 NewTarget。
这适用于我们将此构造函数作为函数调用并且活动函数对象为 null 的情况(当我们从脚本或模块下调用它时,它是null)。
转到行:
- 让原型成为?GetPrototypeFromConstructor (newTarget, "% ArrayPrototype%").
转到算法 GetPrototypeFromConstructor 并找到以下内容:
- Assert: IsCallable(构造函数)为真。
不能有空,因为空是不可调用的。
我们得出一个结论:
- 我们误解了一些东西。
- 规格错误
这是怎么回事?
关于NewTarget
是什么的令人困惑的一点,我认为是这个难题的关键。该规则的含义基本上是:
- 如果
Array
作为普通函数调用,则newTarget
的值是构造函数Array
- 如果
Array
被调用为new Array
,则newTarget
的值也是构造函数Array
为什么? 好吧,当调用[[Construct]]
操作时,第二个参数给出newTarget
。对[[Construct]]
操作的调用将构造函数本身作为该参数传递。但是,对Array
的简单调用不涉及该操作;这只是一个普通的[[Call]]
.所以在这种情况下NewTarget
是undefined
,所以规则说newTarget
是"活动函数上下文"。 因为我们谈论的是Array
构造函数中发生的事情,所以活动函数上下文显然是该函数;否则我们为什么要阅读规范的那一章?
为什么这样措辞? 我不知道。