underscore.js是否在_.each中创建了需要被包含的匿名func对象?

时间:2015-02-21 12:06:40

标签: javascript garbage-collection underscore.js anonymous-function

我在代码中使用了很多_.each而不是for循环。来自Underscore.js库的_.each函数是否在每次调用时创建一个新的匿名函数?例如

_.each(this.sprites, function(sprite) {
    sprite.draw();
    this.spriteDraws++
}, this);

Unerscore.js是否在应用程序循环的每一帧上创建一个新的匿名函数?该功能是否需要进行垃圾回收?

我注意到我的应用程序每帧都会创建一个新对象,并且无法将它们根除(一个非升级的锯齿模式 - 在每个帧上,创建相同数量的对象,然后定期进行驻留)。也许这可能是一个原因。

谢谢!

更新: 尽管看起来很愚蠢,但我意识到我是罪魁祸首。在每次调用_.each时,我都会创建一个新的匿名函数并将其传递给Underscore.js。谢谢Bergi确认。我已经测试了代码,它已经创建了更少的对象。

更新的问题: 是否应该预先定义函数并将其放入变量中以供重用?或者,在处理数组时,是否应该使用更传统的for循环?

1 个答案:

答案 0 :(得分:0)

没有。它没有

来自:https://github.com/jashkenas/underscore/blob/master/underscore.js

  // The cornerstone, an `each` implementation, aka `forEach`.
  // Handles raw objects in addition to array-likes. Treats all
  // sparse array-likes as if they were dense.
  _.each = _.forEach = function(obj, iteratee, context) {
    iteratee = optimizeCb(iteratee, context);
    var i, length;
    if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
        iteratee(obj[i], i, obj);
      }
    } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
        iteratee(obj[keys[i]], keys[i], obj);
      }
    }
    return obj;
  };