只是一个小的理论性能问题:
如果我有类似的东西:
$(".somediv").each(function() {
// perform some heavy stuff here
});
如果我将匿名函数的代码重构为命名函数,例如:
f = function() {
// perform some heavy stuff here
};
$(".somediv").each(f);
不知何故,我有这种非理性的怀疑,它告诉我也许每次循环中都会重新创建匿名函数?
只是一个小的理论性能问题:
如果我有类似的东西:
$(".somediv").each(function() {
// perform some heavy stuff here
});
如果我将匿名函数的代码重构为命名函数,例如:
f = function() {
// perform some heavy stuff here
};
$(".somediv").each(f);
不知何故,我有这种非理性的怀疑,它告诉我也许每次循环中都会重新创建匿名函数?
如果您关心性能,那么您不应该使用.each()
. for
使用循环或while
循环迭代集合的内容并且根本没有函数调用比使用.each()
其对每个项目的结果函数调用要快得多。
在回答您的问题时,匿名函数不会比命名函数慢。差异在运行时之前的解析时解决。
这个 jsPerf显示了一个普通的循环,几乎比http://jsperf.com/each-vs-for-loop-minefor
快 10 倍。.each()
让我们考虑代码(jquery 1.7.1):
// "public" each
each: function( callback, args ) {
return jQuery.each( this, callback, args );
}
// "local" each
each: function( object, callback, args ) {
// [...]
if (args) {
// [ args is for internal use ...]
// A special, fast, case for the most common use of each
} else {
if (isObj) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
// [...]
可以看到,callback
直接引用和使用。没有复制callback
功能。不过,如果 jQuery 要复制函数,您建议的解决方法将在jQuery 中产生相同的行为。
注意:在 JavaScript 中,函数是对象。一种函数声明语法与另一种不同,没有“不合理”的理由。唯一的区别是范围。您建议的解决方法将使该函数成为全局函数,而另一个匿名函数是each
调用的“本地”函数
它没有被重新创建,它被创建一次并且引用被传递给 function $.each()
。然后该函数通过其引用调用匿名函数。
如果存在差异,我认为除了其他人阅读您的代码时最容易理解的模式之外,使用不同的模式并不足以保证使用不同的模式。如果代码中出现性能问题,请对其进行测量并找到瓶颈。几乎可以肯定它不是来自这样的东西。
这是 .each() 和 for 循环的比较: