Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用apply重写调用?_Javascript - Fatal编程技术网

Javascript 如何使用apply重写调用?

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]);

这就是问题陈述:

想象一下JavaScript本机没有包含调用函数。然而,apply函数仍然存在

使用apply编写调用

注意:console.log在内部使用“call”函数,这意味着您无法使用console.log进行调试,因为它将调用空函数或导致无限循环

这是我的尝试(不起作用):

第二次尝试:

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);
};