我试图了解Function.prototype.call()
的工作原理。
我知道它做了什么,我可以使用它,但我很好奇这个方法是如何实现的。
是否可以从头开始编写一个完全相同的javascript方法?
答案 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))