Некоторое время я не был уверен в правилах сборки мусора JS вокруг замыкания, поэтому я полагаю, что мог бы также спросить... Вот хороший пример, который меня интересует, с использованием метода jQuery $.each
:
storeSelection: function() {
var enabledIds = {};
$.each(this.nodes, function(index, node) {
if (node.enabled) {
enabledIds[ node.id ] = true;
}
});
this.selection = enabledIds;
}
Приведенный выше фрагмент, конечно же, является частью литерала объекта. Итак, я создал новый объект в верхней части внешней функции, который будет хранить идентификаторы включенных элементов в массиве. Используя метод jQuery .each()
, я перебираю массив элементов и регистрирую включенные идентификаторы. Наконец, я сохраняю выбор как элемент родительского объекта.
Мой вопрос касается той внутренней функции, которая ссылается на объект enabledIds
из внешней области. Поскольку enabledIds
останется, не помешает ли это сбору внутренней функции? Я бы предположил, что нет, потому что это просто переменная, которая очищается в конце внутренней функции, верно? Чтобы стать утечкой, я предполагаю, что внутренняя функция должна будет сделать жесткую ссылку на внешний объект, например:
$.each(this.nodes, function(index, node) {
this.badIdea = enabledIds;
if (node.enabled) {
enabledIds[ node.id ] = true;
}
});
Однако... Я всегда туманно отношусь к этому правилу. Будем признательны за любую помощь в устранении этой путаницы!