调用函数的有界调用

Bounded call of call function

我很好奇在 Javascript 中有界调用函数是如何工作的。令人困惑的例子:

Number.call.bind(Array)(undefined, 1, 2)

输出:

[1, 2]

的确,我可以编写任何函数来代替 Number,但它会被忽略。我的假设是在某个时刻 Array 被称为构造函数,而 1 和 2 作为参数传递。我的问题是调用函数内部是什么导致了这种奇怪的行为?

谢谢。

call 与任何其他函数没有太大区别(期望它可以以某种方式设置 this)。这是call的伪代码伪版本:

function call(thisArg, ...args) {
    let boundThis = this.bind(thisArg);
    return boundThis(...args);
}

所以,它真正做的就是将函数的 this 设置为传递的第一个参数,然后将其余参数传递给函数。

call.bind(Array)call 内的 this 绑定到 Array,即 "fixes" 将 .call 应用于 Array,意味着它现在总是调用 Array。所以你基本上有

let boundThis = Array.bind(thisArg);
return boundThis(...args);

基本上是 Array(...args)

Function.prototype.bind() is the "thisArg" with which the bound function is called. Since the bound function in your example is Function.prototype.call() 中的第一个参数,有效地returns call() 的绑定版本,因此它等同于 Array.call()call() 的第一个参数是 "thisArg"(再次), 调用的函数 被调用,并且其余是传递给函数的参数。所以现在我们在 Array(1, 2),那 returns 你的输出。

您通过绑定所做的与以下内容没有区别:

Number.call.call(Array, undefined,1, 2);

上面向右边的call发送了四个参数,第一个是调用左边call的上下文。因此,在右侧的调用完成后,代码分解为:

Array.call(undefined,1, 2);

哪些因素:

Array(1, 2);

注意 Array 实际上是被调用的函数。
它可以是任何其他函数而不是构造函数:

Number.call.call(alert, window,"hello world");