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

j03*_*03m 2 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);
}
Run Code Online (Sandbox Code Playgroud)

执行此代码:

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


for (i = 0; i < loops; i++) {
    declaredFni, i);
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码:

for (i = 0; i < loops; i++) {
  var func = function(a, b) {
    return a + b;
  };
  func(i, i);
}
Run Code Online (Sandbox Code Playgroud)

比这段代码慢得多:

var expfunc = function(a, b) {
  return a + b;
};
for (i = 0; i < loops; i++) {  
  expfunc(i, i);
}
Run Code Online (Sandbox Code Playgroud)

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

sok*_*npk 8

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

for (var i = 0; i < loops; i++) {
   function func(a, b) {
    return a + b;
  };
  func(i, i);
}
Run Code Online (Sandbox Code Playgroud)

完全等同于以下代码:

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

for (i = 0; i < loops; i++) { declaredFn(i, i); }
Run Code Online (Sandbox Code Playgroud)

因为function声明被提升到了顶部.

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

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