【问题标题】:advantage of object.method(arg) vs method.apply(object, [arg])?object.method(arg) 与 method.apply(object, [arg]) 的优势?
【发布时间】:2014-06-13 17:24:33
【问题描述】:

使用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?");

对比

sayHello.apply(myName, [" How are you?"]);

更新:谢谢大家的信息。我了解call()apply(),但我不确定这两个在这个例子中是否有优势。

【问题讨论】:

    标签: javascript


    【解决方案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);
    

    我希望这会有所帮助!

    【讨论】:

    • 帮助很大。谢谢!我不知道是否有任何理由选择 call()apply() 而不是直接引用该方法。
    • 很高兴我能帮上忙,杰夫!这可能会令人困惑……JavaScript 提供了很大的灵活性,但它可能很奇怪……
    【解决方案2】:

    callapply 如其他答案中所述,允许您为相关功能定义 this

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

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

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

    【讨论】:

      【解决方案3】:

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

      看看docs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 2013-02-13
        相关资源
        最近更新 更多