为什么我在return语句'Function.call.apply(this,arguments)'中需要'call'

时间:2015-12-29 00:40:47

标签: javascript javascript-objects

大家好,

所以我浏览了JavaScript Garden,我遇到了一段我不太了解的代码片段。 在Person.fullname中,我注意到它有以下代码片段(我在帖子的底部附上了代码段)。

return Function.call.apply( Person.prototype.fullname, arguments );

上面的代码与以下代码有什么区别?

return Function.apply( Person.prototype.fullname, arguments );

修改

<小时/> 我注意到当我将上面的代码更改为以下代码时,它开始工作。

return Person.fullname.call.apply( Person.prototype.fullname, arguments );

我的新问题是:

return Person.fullname.call.apply( Person.prototype.fullname, arguments )

相同
return Function.call.apply( Person.prototype.fullname, arguments ); ?

现在,如果我从其中一个方法中移除call,我会收到错误,但我不明白为什么在call之前我们需要apply

~~`编辑结束

截至目前,我目前还不确定这段代码的行为方式。关于它如何工作以及何时应用的详细解释将有很大帮助。谢谢!

function Person(first, last) {
  this.first = first;
  this.last = last;
}
Person.prototype.fullname = function(joiner, options) {
  options = options || { order: "western" };
  var first = options.order === "western" ? this.first : this.last;
  var last =  options.order === "western" ? this.last  : this.first;
  return first + (joiner || " ") + last;
};

// Create an unbound version of "fullname", usable on any object with 'first'
// and 'last' properties passed as the first argument. This wrapper will
// not need to change if fullname changes in number or order of arguments.
Person.fullname = function() {
  // Result: Person.prototype.fullname.call(this, joiner, ..., argN);
  return Function.call.apply(Person.prototype.fullname, arguments);
};

var grace = new Person("Grace", "Hopper");

// 'Grace Hopper'
grace.fullname();

// 'Turing, Alan'
Person.fullname({ first: "Alan", last: "Turing" }, ", ", { order: "eastern" });

0 个答案:

没有答案