Function()。prototype.call()实现

时间:2014-08-07 14:38:51

标签: javascript

我试图了解Function.prototype.call()的工作原理。 我知道它做了什么,我可以使用它,但我很好奇这个方法是如何实现的。

是否可以从头开始编写一个完全相同的javascript方法?

1 个答案:

答案 0 :(得分:1)

如果没有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))