【问题标题】:JQuery .each() : performance of anonymous function?JQuery .each() :匿名函数的性能?
【发布时间】:2012-08-03 04:03:49
【问题描述】:

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

如果我有类似的东西:

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

如果我将匿名函数的代码重构为像这样的命名函数,代码的执行会不会更快:

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

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

不知何故,我有一个不合理的怀疑告诉我,也许匿名函数每次在每个循环中都会重新创建?

【问题讨论】:

  • 非理性怀疑是非理性的
  • 这就是 jsperf.com 这样的工具旨在解决的问题。此外,答案可能会因浏览器而异!
  • 尝试删除循环中不需要的任何东西,以便“在此处执行一些繁重的工作”,例如。声明的变量应该在循环之外。您提到的两个选项之间没有太大区别。

标签: javascript jquery


【解决方案1】:

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

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

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

【讨论】:

  • 你能指出一些关于在解析时而不是在运行时解决这些差异的参考吗?那么this answer 有意义吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 不建议在性能测试过程中使用console.log(),因为它不能保证一定的开销。
      猜你喜欢
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2011-07-18
      • 2012-01-30
      • 1970-01-01
      • 2023-04-04
      • 2013-07-01
      • 2012-05-19
      相关资源
      最近更新 更多