调用函数的有界调用
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");
我很好奇在 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");