【问题标题】:please explain the apply and call methods in javascript [duplicate]请解释javascript中的应用和调用方法[重复]
【发布时间】:2011-05-24 15:18:18
【问题描述】:

可能重复:
What is the difference between call and apply?

apply 和 call 方法的主要区别是什么... 我浏览了网络但无法找到最佳解决方案.. 请朋友们帮帮我...

【问题讨论】:

  • 没有最佳解决方案;)
  • @Felix:+1,我没想到这可能是一个骗局。
  • @Felix Kling:糟糕,没注意到那个 ;)
  • @Andy E, @elusive:别担心,伙计们,我自己回答了足够多的重复问题 :)

标签: javascript


【解决方案1】:

.apply().call() 非常相似。唯一的区别是它们如何将参数传递给被调用的函数。 .apply() 接受一个参数数组,而 .call() 可以像常规函数调用一样使用:

someFunction.apply(context, [argument1, argument2]);

相当于:

someFunction.call(context, argument1, argument2);

【讨论】:

  • 谢谢你,很高兴听到......但是我们可以在任何情况下使用任何方法吗?或者这些方法是否有任何限制......
  • @Mihir:这两个方法都是函数对象原型的成员。两者都可以用于任何功能。
【解决方案2】:

主要区别在于call接受参数列表,其中第一个参数之后的参数直接传递给方法:

myFunc.call(thisObj, arg1, arg2, arg3);

apply 只接受两个参数 - 第一个是 this 对象,第二个是要传递给方法的参数数组:

myFunc.apply(thisObj, [arg1, arg2, arg3]);

apply 通常用于您想将包含传递给当前函数的参数列表的arguments 对象传递给另一个方法的情况:

function myOtherFunc(arg1, arg2, arg3) {
    if (typeof arg1 == "object" && arg1 !== null)
        myFunc.apply(this, arguments);
}

【讨论】:

  • 谢谢你,很高兴听到......但是我们可以在任何情况下使用任何方法吗?或者这些方法是否有任何限制......
  • @Mihir:apply 几乎可以在您能想到的任何地方使用call。但是,call 并不是apply 的绝佳替代品,因为它不是动态的。我已经更新了我的答案,给你一个使用 apply 的例子。
  • @Mihir: call 只是apply 的语法糖。只需一个参数即可更轻松地调用函数。
【解决方案3】:

JavaScript 中的每个函数除了默认参数外还接收两个对象。它们是thisargumentsthis 的值由它的调用模式决定。 applycall 可用于调用函数并为其提供默认的 this 对象。

这在许多情况下都非常有用。例如,arguments 是一个类似数组的对象,但并不是真正具有所有有用 Array 方法的 Array。因此,要在arguments 上应用数组方法slice,您可以这样做:

Array.prototype.slice.apply(arguments, [1, 2])

如果 argumentsArray 类型的对象,您可以使用

arguments.slice(1, 2) 

call 只不过是 apply 的修改版本。请参阅 elusive 的评论。

Douglus Crockford 先生在此视频中对 JavaScript 函数进行了很好的介绍:Function the Ultimate

【讨论】:

  • arguments 的内容有什么相关性?
  • OP 一直在询问有关 JavaScript 的问题。我以为他是从 JS 开始的。我认为对函数调用模式的适当介绍对他很有用。 :)
猜你喜欢
  • 2019-05-25
  • 2013-09-15
  • 2015-07-29
  • 2017-04-06
  • 2015-02-27
  • 1970-01-01
  • 2011-04-04
  • 2019-01-19
相关资源
最近更新 更多