在以下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);
}
为什么呢?内部发生了什么?
答案 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);
}
您正在为变量分配一个函数,该变量将在当前作用域的其余部分中可用。当你在循环中这样做时,函数被定义和分配很多次,因此比你提到的其他情况消耗更多的时间。