0

Я использую много _.each вместо цикла for в моем коде. Выполняет ли функция _.each из библиотеки Underscore.js новую анонимную функцию для каждого вызова? Например.Создает ли underscore.js анонимные объекты func в _.each, которые нужно мусор?

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

Создает ли Unerscore.js новую анонимную функцию для каждого кадра цикла приложения? Нужно ли собирать эту функцию для сбора мусора?

Я заметил, что мое приложение создает бук новых объектов в каждом фрейме и не может их выкорректировать (неважное изображение пилообразного рисунка - на каждом кадре, создается такое же количество объектов и впоследствии мусор). Возможно, это может быть причиной.

Спасибо!

ОБНОВЛЕНИЕ: Как можно глупо, я понял, что я виновник. В каждом вызове _.each я создаю новую анонимную функцию и передаю ее в Underscore.js. Спасибо, Берги подтвердил это. Я тестировал код, и он уже создает меньше объектов.

Обновленный вопрос: Следует ли предпочесть функцию и поместить ее в переменную для повторного использования? Или нужно использовать более традиционный для цикла при работе с массивами?

+0

Я не читал в документации, но я думаю, что '_' есть метод, называемый каждый, который проходит каждый функции на 'Array.prototype.forEach'. Если это так, новый объект не создается. – Mouser

+0

* Вы * создаете объект с выражением функции. – Bergi

+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; 
    }; 
+0

Однако вы хотите изучить 'optimizeCb'. – Bergi

 Смежные вопросы

  • Нет связанных вопросов^_^