Javascript 调用函数的有界调用

Javascript 调用函数的有界调用,javascript,ecmascript-5,Javascript,Ecmascript 5,我很好奇有界调用函数在Javascript中是如何工作的。令人困惑的例子是: Number.call.bind(Array)(undefined, 1, 2) 输出: [1, 2] 事实上,我可以编写任何函数而不是数字,这将被忽略。我的假设是,在某个时刻,数组作为构造函数调用,1和2作为参数传递。我的问题是调用函数的内部是什么导致了这种奇怪的行为 谢谢。调用与任何其他函数没有太大区别(希望它能以某种方式设置此)。以下是调用的伪代码伪版本: function call(thisArg, ...

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

Number.call.bind(Array)(undefined, 1, 2)
输出:

[1, 2]
事实上,我可以编写任何函数而不是数字,这将被忽略。我的假设是,在某个时刻,数组作为构造函数调用,1和2作为参数传递。我的问题是调用函数的内部是什么导致了这种奇怪的行为


谢谢。

调用
与任何其他函数没有太大区别(希望它能以某种方式设置此)。以下是
调用的伪代码伪版本

function call(thisArg, ...args) {
    let boundThis = this.bind(thisArg);
    return boundThis(...args);
}
因此,它真正做的就是将函数的
设置为传递的第一个参数,然后将其余参数传递给函数

call.bind(Array)
内部的
call
绑定到
Array
,即它“修复”了
.call
应用到
Array
的函数,这意味着它现在将始终调用
Array
。所以你基本上有

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

基本上是数组(…args)

中的第一个参数是“thisArg”,用它调用绑定函数。由于示例中的绑定函数是,它实际上返回了
call()
的绑定版本,因此它相当于
Array.call()
call()
的第一个参数是“thisArg”(再次),调用被调用函数,其余参数是传递给函数的参数。现在我们在
数组(1,2)
,它返回您的输出。

您通过bind执行的操作与:

Number.call.call(Array, undefined,1, 2);
上面向右侧的
调用
发送了四个参数,其中第一个参数是调用左侧的
调用
的上下文。因此,在右侧的调用完成后,代码将考虑:

Array.call(undefined,1, 2);
Array(1, 2);
应考虑哪些因素:

Array.call(undefined,1, 2);
Array(1, 2);
请注意,
Array
实际上是被调用的函数。
它可以是任何其他函数,而不是构造函数:

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

值得注意的是,这仍然存在
数组(someNumber)
问题。可能不应该回答带有ES2015功能的ECMAScript 5问题。@Amit:你看不出来这是伪代码而不是ES6吗?:皮耶。。。你可以这么说,但你也可以坚持“旧标准”——这是你的答案,你自己打电话。(回答很好:-)@Amit:好吧,我只能用
来表达这一点。在ES5中应用
,这可能不会使整个事情更容易理解。