使用call()
或apply()
代替object.method()
是否有优势?有人能提供一个例子,一个人比另一个人更受欢迎吗?我正在通过Eloquent JS的Chapter 8阅读,看起来两者中的任何一个都可以用于相同的结果。
function sayHello(x) {
console.log("Hello, " + this.first_name + "." + x);
}
var myName = {
first_name: "John",
greeting: sayHello
}
myName.greeting(" How are you?");
VS
sayHello.apply(myName, [" How are you?"]);
更新:感谢大家的信息。我理解call()
和apply()
,但我不确定这个例子是否有利。
答案 0 :(得分:1)
正如您所写,使用call()
或apply()
没有任何好处。直接调用该方法更有意义,更易于阅读。
call()
和apply()
主要用于显式控制函数上下文中this
引用的对象。让我们在您的示例中说,您不想让greeting
成为myName
对象的属性。然后你 使用call()
或apply()
:
function sayHello(x) {
console.log("Hello, " + this.first_name + "." + x);
}
var myName = {
first_name: "John",
}
sayHello.call(myName, 'How are you?');
sayHello.apply(myName, ['How are you?']);
或者您可以使用它来调用另一个对象上的方法:
function sayHello(x) {
console.log("Hello, " + this.first_name + "." + x);
}
var myName = {
first_name: "John",
greeting: sayHello,
}
var herName = {
first_name: "Mary",
}
sayHello.call(herName, 'How are you?');
sayHello.apply(herName, ['How are you?']);
// you could even get weird...
myName.greeting.call(herName, 'How are you?');
myName.greeting.apply(herName, ['How are you?']);
就call()
和apply()
之间的差异而言,它只是如何处理参数。如果您事先知道参数,则可以使用call()
并将它们作为参数传递。如果您的参数是可变的,则可以在数组中收集它们并使用apply()
。这个规范的例子是找到一组数字的最大值:
var nums = [ 3, 17, 5, -10, 16 ];
Math.max.apply(null, nums);
我希望这有帮助!
答案 1 :(得分:1)
call
和apply
允许您为相关功能定义this
。
jQuery是这种用法的一个很好的例子,因为你可以在回调中访问DOM元素,它允许$(this)
同样apply
非常强大,因为它在调用具有可变数量的已知参数的函数时是一个很好的工具。
更常见的call
和apply
通常用于method borrowing,一个流行的示例是在函数中使用SomeConstructor.call(this)
来部分应用继承。
答案 2 :(得分:0)
使用call和apply可以指定函数的上下文,直接调用它的上下文将是"这个"的当前范围。
查看docs。