Javascript Function().prototype.call()实现
我试图理解Javascript Function().prototype.call()实现,javascript,Javascript,我试图理解Function.prototype.call()是如何工作的。 我知道它做什么,我可以使用它,但我很好奇这个方法是如何实现的 是否可以从头开始编写一个javascript方法来实现完全相同的功能?如果没有eval,就不可能“展开”变量参数。如果您觉得合适,可以尝试以下方法: function myCall(fun, obj) { var args = [].slice.call(arguments, 2); var arglist = args.map(functio
Function.prototype.call()
是如何工作的。
我知道它做什么,我可以使用它,但我很好奇这个方法是如何实现的
是否可以从头开始编写一个javascript方法来实现完全相同的功能?如果没有eval
,就不可能“展开”变量参数。如果您觉得合适,可以尝试以下方法:
function myCall(fun, obj) {
var args = [].slice.call(arguments, 2);
var arglist = args.map(function(_, n) { return "args[" + n + "]" }).join(',');
obj._tmp = fun;
return eval("obj._tmp(" + arglist + ")")
}
例如:
foo = {
x: 123
}
bar = function(y) { return this.x + y }
console.log(myCall(bar, foo, 444))
它是一个内置函数-据我所知,没有办法在纯JS中实现它。JavaScript运行时一般都可以调用函数,其中一部分工作是设置
this
的值。从这个角度来看,.call()
和.apply()
的存在并不令人惊讶;如果这件事要成功的话,它们几乎都必须存在。@Alnitak谢谢你,我今天花了几个小时试图找到这方面的信息,有点着迷了。你可能救了我一天剩下的时间:D@DominikGaborJS将函数视为第一类对象,然后将函数视为尖头对象,这表明该语言必须具有调用函数对象的内在方法(没有双关语)。该方法是.call
(和.apply
)仅供参考:在现代JS中,您可以从参数
数组中复制并使用apply。因此,apply是基本函数,可以根据它实现调用