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

时间:2014-11-02 22:26:00

标签: javascript performance

在以下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);
}

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

2 个答案:

答案 0 :(得分:8)

如果使用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); }

因为function声明被提升到顶部。

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

有关详细信息,请参阅this answer

答案 1 :(得分:0)

在摘录

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

您正在为变量分配一个函数,该变量将在当前作用域的其余部分中可用。当你在循环中这样做时,函数被定义和分配很多次,因此比你提到的其他情况消耗更多的时间。