循环中javascript中函数声明与函数表达式的性能

Performance of function declaration vs function expressions in javascript in a loop

本文关键字:函数 性能 表达式 声明 javascript 循环      更新时间:2023-09-26

在以下jsperf中:http://jsperf.com/defined-function-vs-in-loop-function/3

你会注意到这个代码:

for (var i = 0; i < loops; i++) {
   function func(a, b) {
    return a + b;
  };
  func(i, i);
}

与此代码不相上下:

function declaredFn(a, b) {
    return a + b;
};

for (i = 0; i < loops; i++) {
    declaredFni, i);
}

但是这个代码:

for (i = 0; i < loops; i++) {
  var func = function(a, b) {
    return a + b;
  };
  func(i, i);
}

明显慢于此代码:

var expfunc = function(a, b) {
  return a + b;
};
for (i = 0; i < loops; i++) {  
  expfunc(i, i);
}

为什么?内部发生了什么?

如果使用function fn() {}声明定义一个函数,它将被提升到顶部。因此,这个代码:

for (var i = 0; i < loops; i++) {
   function func(a, b) {
    return a + b;
  };
  func(i, i);
}

与此代码完全等效

function declaredFn(a, b) { return a + b; };
for (i = 0; i < loops; i++) { declaredFn(i, i); }

因为CCD_ 2声明被提升到顶部。

但是,var fn = function() {}表达式不会被提升,因此您最终会在每个循环上定义该函数。

有关详细信息,请参阅此答案。

在片段中

for (i = 0; i < loops; i++) {
  var func = function(a, b) {
    return a + b;
  };
  func(i, i);
}

您正在将一个函数分配给一个变量,该变量将在当前范围的其余部分中可用。当您在循环中执行此操作时,函数会被多次定义和分配,因此比您提到的其他情况下花费更多的时间。