正如您所写,使用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);
我希望这会有所帮助!