JavaScript性能:通话与应用

params是一个空数组或nullfunc.apply(obj, params)func.apply(obj, params)切换到func.call(obj)是否有性能优势?

我的意思是,调用func.call(obj)比调用func.apply(obj, null)更快吗?

我最感兴趣的是在NodeJS 4.x下的性能。

这是一个algorithm,必须做很多这样的调用。

哈,有趣的是:它看起来像applycall慢。 8-)

  ~/tmp ω cat test.js function work(a, b, c) { // do some work } var a = [1, 2, 3]; for (var j = 0; j < 4; j++) { console.time('apply-ing'); for (var i = 0; i < 1000000; i++) { work.apply(this, a); } console.timeEnd('apply-ing'); console.time('call-ing'); for (var i = 0; i < 1000000; i++) { work.call(this, 1, 2, 3); } console.timeEnd('call-ing'); } ~/tmp ω node test.js apply-ing: 42ms call-ing: 5ms apply-ing: 40ms call-ing: 5ms apply-ing: 42ms call-ing: 5ms apply-ing: 39ms call-ing: 6ms ~/tmp ω node --version v4.1.2 ~/tmp ω 

基本上,他们会做同样的步骤:

Function.prototype.apply( thisArgargArray

  1. 如果IsCallable ( func )为false,则引发TypeErrorexception。
  2. 如果argArraynullundefined ,那么
    1. 返callback用func的[[Call]]内部方法的结果,提供thisArg作为这个值和一个空的参数列表。

Function.prototype.call( thisArg [, arg1 [, arg2 ,…]])

  1. 如果IsCallable ( func )为false ,则引发TypeErrorexception。
  2. argList是一个空列表 。
  3. 如果使用多个参数调用此方法,则以arg1开始的从左到右的顺序将每个参数作为argList的最后一个元素
  4. 返callback用func的[[Call]]内部方法的结果,提供thisArg作为这个值, argList作为参数列表。

所以,如果有的话,差异应该取决于实施,而且可以忽略不计。