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