Javascript 如何使用apply重写调用?
这就是问题陈述: 想象一下JavaScript本机没有包含调用函数。然而,apply函数仍然存在 使用apply编写调用 注意:console.log在内部使用“call”函数,这意味着您无法使用console.log进行调试,因为它将调用空函数或导致无限循环 这是我的尝试(不起作用): 第二次尝试:Javascript 如何使用apply重写调用?,javascript,Javascript,这就是问题陈述: 想象一下JavaScript本机没有包含调用函数。然而,apply函数仍然存在 使用apply编写调用 注意:console.log在内部使用“call”函数,这意味着您无法使用console.log进行调试,因为它将调用空函数或导致无限循环 这是我的尝试(不起作用): 第二次尝试: Function.prototype.call = function(a) { var args = Array.prototype.slice.apply(arguments,[1]);
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);
这似乎在JSFIDLE中得到了验证,但在我正在解决问题的平台(codewars.com)上没有得到验证
编辑:谢谢。我尝试了同样的方法,但没有使用return,代码没有通过。然而,行为似乎是一样的。如果我回来或不回来有什么区别?我认为我的尝试是正确的,因为call应该调用访问call的函数,对吗?在这种情况下,返回调用函数的结果对我来说似乎有点奇怪
但我想解释一下:如果我对foo.call(a)使用默认调用,那么我就是用a调用foo,所有返回行为都与foo相同。在我的第二次尝试中,我们调用this.apply,以便使用调用函数。在我最初的尝试中,Function.prototype.apply不知道是谁调用了apply。但是如果我们所做的只是调用apply,而不返回,那么如果原始函数(this)有一个返回值,我们将无法将其返回,并且该行为将不同于默认调用的行为。是这样吗
Function.prototype.call = function() {
var args = Array.prototype.slice.apply(arguments,[1]);
return this.apply(arguments[0], args);
};
这就是你要找的吗?你就在不远处。。。不要欺骗自己,让自己错过了自己解决这个问题所能提供给你的学习机会。我的提示:首先编写一个“常规”调用函数,一旦你成功了,然后尝试将a调用方法添加到function.prototype中。是的,我在第二次尝试中做了类似的事情。我写了一些想法,你能确认一下他们是否正确吗?
Function.prototype.call = function() {
var args = Array.prototype.slice.apply(arguments,[1]);
return this.apply(arguments[0], args);
};