这是问题陈述:
假设JavaScript没有本地包括call函数。然而,apply函数仍然存在。
使用apply编写call。
注意:console.log内部使用“call”函数,这意味着您不能使用console.log进行调试,因为它将调用一个空函数或导致无限循环。
这是我的尝试(不起作用):
假设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)有一个返回值,我们将无法得到它,并且行为将与默认调用的行为不同。我理解的对吗?