Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Function().prototype.call()实现_Javascript - Fatal编程技术网

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是基本函数,可以根据它实现调用