使用调用之间的区别和调用一个函数可应用于什么?

var func = function(){
  alert('hello!');
};

func.apply();

vs

func.call();

有两种方法之间的性能差异吗?最好使用通过调用应用时,反之亦然?

2009-12-31 19:56:25
问题评论:

我使用过电话和适用的在过去的三周内几乎每一天,仍不记得区别。

思考a中的数组参数和c列的参数的调用中的应用。

@LarryBattle 完全帮我记住我 70-480 认证的区别:)

@LarryBattle 办几乎是相同的但我认为在适用于数组和 c 中调用的逗号 (例如逗号分隔的参数)。

@LarryBattle 很好助记符 Larry,最后记忆关联名称

回答:

区别在于apply,可以调用该函数不带arguments作为数组;call需要被显式列出的参数。有用的助记键是"A 的数组"和 C 的逗号

请参阅应用调用MDN 的文档.

伪语法︰

theFunction.apply(valueForThis, arrayOfArgs)

theFunction.call(valueForThis, arg1, arg2, ...)

示例代码︰

function theFunction(name, profession) {
    console.log("My name is " + name + " and I am a " + profession + ".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");

// My name is John and I am a fireman.
// My name is Susan and I am a school teacher.
// My name is Claude and I am a mathematician.

这两个支持大多数的浏览器?我好像记得阅读该call()却超过 IE 的事情。

需要添加的一点是,参数必须是数字数组 ([])。关联数组 ({}) 将无法工作。

@KevinSchroeder︰ 在 javascript 中, []称为数组{}称为对象.

我通常用来忘记接受一个数组中,并且它需要您可以列出这些参数。要记住它,我使用的技术是如果该方法的第一个字母开头,然后它采用数组,即本机应用数组

仅 @SAM 使用而不是普通的函数调用调用是有意义,如果您需要更改函数调用的值。(转换为数组的函数的参数对象) 的一个示例︰ Array.prototype.slice.call(arguments)[].slice.call(arguments)应用是有意义,如果您具有的参数数组,例如在调用另一个函数 (几乎) 相同的参数的函数中。建议如果您需要并为那些特殊的场合,当真正需要它们保存调用,并将应用程序不,使用普通的函数调用funcname(arg1)

K.Scott Allen 问题上有很好的 writeup

基本上,它们的差异在于如何处理函数参数。

Apply() 方法等同于 call(),apply() 需要第二个参数作为数组除外。数组表示目标方法的参数"。

因此︰

// assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);

apply() 和 call() 的第二个参数是可选的不需要。

第一个参数不需要太。

回答的部分,关于何时使用每个函数,使用apply,如果您不知道您将传入的参数的数目,或它们是否已经在数组或类似数组的对象 (如要转发您自己的参数的arguments对象。使用call否则,因为没有必要来包装数组中的参数。

f.call(thisObject, a, b, c); // Fixed number of arguments

f.apply(thisObject, arguments); // Forward this function's arguments

var args = [];
while (...) {
    args.push(some_value());
}
f.apply(thisObject, args); // Unknown number of arguments

当我在不传递任何参数 (如您的示例) 时,我更喜欢call由于我调用函数。apply将意味着您正在应用的函数 (不存在) 的参数。

就不会有任何的性能差异,也许除了如果您使用apply并包装在一个数组中的参数 (例如f.apply(thisObject, [a, b, c])而不是f.call(thisObject, a, b, c))。我还没有测试,因此可能有差异,但这是非常浏览器特定。如果这样做,则可能call是速度更快,如果数组中没有参数和apply速度更快。

虽然这是一个旧的主题,我只是想指出的是,.call 是速度稍快于.apply。我不能告诉您具体的原因。

请参阅 jsPerf, http://jsperf.com/test-call-vs-apply/3


[UPDATE!]

道格拉斯 • Crockford 简要提到的两个,这可能有助于解释的性能差异之间的差异...http://youtu.be/ya4UHuXNygM?t=15m52s

应用采用数组的参数,同时呼叫零个或多个单个参数 !噢 hah !

.apply(this, [...])

.call(this, param1, param2, param3, param4...)

这取决于该函数如何处理参数/数组,如果它不需要处理的数组,花更少的时间吗?

有趣的是即使调用数组中,而是仍要快。jsperf.com/applyvscallvsfn2

是非常浏览器特定的 @JoshMc。在 IE 11 我要获取应用倍呼叫转。

1.创建新的数组表示,垃圾回收器将需要在某些点进行清理。2.访问项在数组中使用取消引用会降低效率比直接访问变量 (参数)。(我认为这是什么 kmatheny 意味着通过"分析",实际上是非常不同的地方。)但这两个我参数解释 jsperf。必须与相关两个函数中,该引擎的实现如也许他们创建一个空数组,如果没有传递。

这里有很好的助记键。一个本机应用使用一个rrays,一个始终采用一个或两个参数。当您使用C所有必须到C帐户的参数的数目。

就在这里有用助记键。我会改变一个或两个参数' 说 '最多的两个参数,因为第一或第二个参数的apply都不是必需的。我不知道不过为什么一个将apply或调用不带参数call看起来好像有人正试图找出为什么这里stackoverflow.com/questions/15903782/...

请输入您的翻译

What is the difference between call and apply?

确认取消