大家好,
所以我浏览了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" });