本文介绍了循环中javascript中函数声明与函数表达式的表现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在以下jsperf中:
In the following 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);
}
为什么?内部发生了什么?
Why? What is happening internally?
推荐答案
如果使用函数定义函数fn(){}
声明,它被提升到顶部。因此,这段代码:
If you define a function using the function fn() {}
declaration, it gets hoisted to the top. Therefore, this code:
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); }
因为函数
声明被提升到顶部。
because the function
declaration gets hoisted to the top.
然而, var fn = function(){}
表达式不升级,所以你最终在每个循环中都定义了函数。
However, var fn = function() {}
expressions do not get hoisted, so you end up defining the function all over on every single loop.
参见了解更多信息。
这篇关于循环中javascript中函数声明与函数表达式的表现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!