如何使用apply重写函数调用?

3
这是问题陈述:
假设JavaScript没有本地包括call函数。然而,apply函数仍然存在。
使用apply编写call。
注意:console.log内部使用“call”函数,这意味着您不能使用console.log进行调试,因为它将调用一个空函数或导致无限循环。
这是我的尝试(不起作用):
Function.prototype.call = function(a) {
  var args = Array.prototype.slice.apply(arguments,[1]);
  Function.prototype.apply(a, args);
}

第二次尝试:

Function.prototype.call = function(a) {
  var args = Array.prototype.slice.apply(arguments,[1]);
  this.apply(a, args);
  console.log("OKAY!");
}

var person1 = {name: 'Marvin', age: 42, size: '2xM'};
var person2 = {name: 'Zaphod', age: 42000000000, size: '1xS'};

var sayHello = function(){
    alert('Hello, ' + this.name);
};

var sayGoodbye = function(){
    alert('Goodbye, ' + this.name);
};

sayGoodbye.call(person2);

这段代码在JSFiddle中看似没问题,但在我解决问题的平台(codewars.com)上却出现了问题。

编辑:谢谢。我尝试过不使用return时,代码未能通过。但是行为似乎没有改变。如果我返回或不返回,有什么区别吗?我认为我的尝试是正确的,因为call应该调用访问call的函数,对吧?在这种情况下,返回调用该函数的结果对我来说有点奇怪。

但是,我试图理解它:如果我使用foo.call(a)默认的调用方式,我会将a作为this调用foo,并且所有的返回行为与foo相同。在我的第二次尝试中,我们调用了this.apply,以便使用调用函数。在我的初始尝试中,Function.prototype.apply不知道谁调用了apply。但如果我们只是调用apply而不返回,则如果原始函数(this)有一个返回值,我们将无法得到它,并且行为将与默认调用的行为不同。我理解的对吗?


3
你的理解还算接近,不要错失自己通过独立解决这个问题所能获得的学习机会。请注意,不要作弊。 - masonk
我的提示:首先编写一个“常规”调用函数,并在使其正常工作后,尝试将调用方法添加到Function.prototype中。 - hugomg
1个回答

0
Function.prototype.call = function() {
  var args = Array.prototype.slice.apply(arguments,[1]);
  return this.apply(arguments[0], args);
};

这是你要找的吗?


是的,在我的第二次尝试中我做了类似的事情。我写了一些想法,你能否确认它们是否正确? - Zack Gao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接