js 的 call 與 apply 速度對(duì)比

最近在看 underscore 的源碼時(shí)發(fā)現(xiàn),作者好多都用 call,而用 apply 比較少,比如說這段:

var optimizeCb = function(func, context, argCount) {
  // 如果沒有指定 this 指向,則返回原函數(shù)
  if (context === void 0) return func;

  switch (argCount == null ? 3 : argCount) {
    case 1:
      return function(value) {
        return func.call(context, value);
      };
    case 2:
      return function(value, other) {
        return func.call(context, value, other);
      };

    // 如果有指定 this,但沒有傳入 argCount 參數(shù)
    // 則執(zhí)行以下 case
    case 3:
      return function(value, index, collection) {
        return func.call(context, value, index, collection);
      };
    case 4:
      return function(accumulator, value, index, collection) {
        return func.call(context, accumulator, value, index, collection);
      };
  }
};

既然 call 和 apply 都能用,那為什么只用 call 而不用 apply 呢?
經(jīng)過網(wǎng)上的搜索發(fā)現(xiàn),call 比 apply 速度快,在 console運(yùn)行如下代碼:

function x(a,b) {}
var a = [1, 2, 3];
console.time("call");
for (var i = 0; i < 1000000; i++) {
  x.call(this, 1, 2, 3);
}
console.timeEnd("call");

console.time("apply");
for (var j = 0; j < 1000000; j++) {
  x.apply(this, a);
}
console.timeEnd("apply");

console的結(jié)果:

可以發(fā)現(xiàn) call 比 apply 快了10ms 左右,那是什么原因造成這樣的呢?
因?yàn)?apply 運(yùn)行前要對(duì)作為參數(shù)的數(shù)組進(jìn)行一系列檢驗(yàn)和深拷貝,而 call 則沒有
我們看一下 ECMAScript 是怎么寫的:

由ECMAScript 標(biāo)準(zhǔn)發(fā)現(xiàn) apply 比 call 的步驟多了好多,這就是 call 比 apply 執(zhí)行速度快的原因!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容