4

只是一个小的理论性能问题:

如果我有类似的东西:

$(".somediv").each(function() {
   // perform some heavy stuff here
});

如果我将匿名函数的代码重构为命名函数,例如:

f = function() {
   // perform some heavy stuff here
};

$(".somediv").each(f);

不知何故,我有这种非理性的怀疑,它告诉我也许每次循环中都会重新创建匿名函数?

4

4 回答 4

3

如果您关心性能,那么您不应该使用.each(). for使用循环或while循环迭代集合的内容并且根本没有函数调用比使用.each()其对每个项目的结果函数调用要快得多。

在回答您的问题时,匿名函数不会比命名函数慢。差异在运行时之前的解析时解决。

这个 jsPerf显示了一个普通的循环,几乎比http://jsperf.com/each-vs-for-loop-minefor快 10 倍。.each()

于 2012-08-06T07:21:50.013 回答
1

让我们考虑代码(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调用的“本地”函数

于 2012-08-06T07:22:21.627 回答
0

它没有被重新创建,它被创建一次并且引用被传递给 function $.each()。然后该函数通过其引用调用匿名函数。

如果存在差异,我认为除了其他人阅读您的代码时最容易理解的模式之外,使用不同的模式并不足以保证使用不同的模式。如果代码中出现性能问题,请对其进行测量并找到瓶颈。几乎可以肯定它不是来自这样的东西。

于 2012-08-06T07:19:31.037 回答
0

这是 .each() 和 for 循环的比较:

http://jsperf.com/jquery-each-perf-test2/2

于 2012-08-06T07:27:27.387 回答