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;
};
Person.fullname = function() {
return Function.call.apply(Person.prototype.fullname, arguments);
};
来自Javascript Garden的代码。
注意,它声明了
Function.call.apply(Person.prototype.fullname, arguments);
将变成这个样子:
Person.prototype.fullname.call(this, joiner, ..., argN);
它意味着apply()函数会先执行,然后是call()函数。
模式:最右侧的call() / apply()
会先被执行
- 因此,最右侧的
apply()
会先执行
apply()
的上下文成为call()
函数的调用者,所以现在是Person.prototype.fullname.call()
apply()
只能使用一个单一数组的参数,所以apply()
提供arguments
给call()
函数,现在是Person.prototype.fullname.call(arguments)
来自@foxiris的示例:
第一个:
Function.apply.call(Array,this,[1,2])
- 最右边的
call()
将首先被执行
call()
的上下文成为 apply()
的调用者,因此现在是 Array.apply()
call()
可以接受多个参数,因此它可以向 apply()
提供 this
和 [1, 2]
,所以现在是 Array.apply(this, [1, 2]);
,这将输出 [1, 2]
第二个:
Function.call.apply(Array,this,[1,2])
- 最右边的
apply()
将首先被执行。
apply()
的上下文变成了 call()
的调用者,所以现在是 Array.call()
。
apply()
只能接受一个单一的数组参数,所以它只能将 this
提供给 call()
,所以现在是 Array.call(this);
,输出是 []
。
第三个:
Function.call.call(Array,this,[1,2])
- 最右边的
call()
将首先被执行。
call()
的上下文(最右边的)成为 call()
的调用者(右数第二个),因此现在是 Array.call()
。
call()
可以接受多个参数,因此它可以将 this
和 [1, 2]
提供给另一个 call()
,因此现在是 Array.call(this, [1, 2]);
,输出是 [[1, 2]]
。
.call
之前忘记了一个prototype
。 - BergiFunction
是一个函数,它从自己的原型中继承了call
。 - Ventero