object.method(arg)vs method.apply(object,[arg])的优点?

时间:2014-06-13 17:24:34

标签: javascript

使用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(),但我不确定这个例子是否有利。

3 个答案:

答案 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)

如其他答案中所述的

callapply允许您为相关功能定义this

jQuery是这种用法的一个很好的例子,因为你可以在回调中访问DOM元素,它允许$(this)

同样apply非常强大,因为它在调用具有可变数量的已知参数的函数时是一个很好的工具。

更常见的callapply通常用于method borrowing,一个流行的示例是在函数中使用SomeConstructor.call(this)来部分应用继承。

答案 2 :(得分:0)

使用call和apply可以指定函数的上下文,直接调用它的上下文将是"这个"的当前范围。

查看docs