请解释JavaScript中的apply和call方法。

7

可能是重复问题:
call和apply有什么区别?

apply和call方法的主要区别是什么?我在网上查找了很久,但无法找到最佳解决方案。请帮助我,朋友们...


没有最佳解决方案 ;) - Felix Kling
@Felix:+1,我没有想到这可能是一个重复的问题。 - Andy E
@Felix Kling:哎呀,没注意到那个;) - jwueller
@Andy E,@elusive:不用担心,伙计们,我已经回答了足够多的重复问题 :) - Felix Kling
3个回答

6
每个 JavaScript 函数除了默认参数外,还会接收两个对象。它们是 thisargumentsthis 的值由其调用模式决定。可以使用 applycall 来调用函数并提供一个默认的 this 对象。
在许多情况下,这将非常有用。例如,arguments 是一个类似数组的对象,但不是具有所有有用的数组方法的 Array。因此,要在 arguments 上应用一个数组方法 slice,可以这样做:
Array.prototype.slice.apply(arguments, [1, 2])

如果arguments是一个Array类型的对象,你可以使用以下方法:

arguments.slice(1, 2) 

call 只是 apply 的一个修改版本。请参考 elusive 的评论。

Douglas Crockford 在这个视频中给出了非常好的 JavaScript 函数介绍:函数的终极


е…ідєЋ arguments зљ„е†…е®№жњ‰д»Ђд№€з›ёе…іжЂ§пјџ - Tim Down
2
OP已经一段时间在问有关JavaScript的问题。我假设他刚开始学JS。我认为向他介绍函数调用模式会对他有所帮助。 :) - dheerosaur

4
主要区别在于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
@Mihir:apply 可以在你能想到的任何地方代替 call。然而,call 不是 apply 的很好替代品,因为它不够动态。我已经更新了我的答案,给你一个使用 apply 的例子。 - Andy E
1
@Mihir:call只是apply的语法糖。这使得使用仅有一个参数的函数更容易调用。 - Felix Kling

3

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

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

等同于:

someFunction.call(context, argument1, argument2);

谢谢,很高兴听到这个。但是我们能在任何情况下使用任何方法吗?还是这些方法有限制? - Mihir
@Mihir:这两种方法都是函数对象原型的成员。它们都可以用于任何函数。 - jwueller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接