Почему Google утверждает, что закрытие Javascript опасно?

Я только что прочитал этот пункт руководства по стилю Google JS: http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Closures#Closures

и я не совсем понимаю. Хотя для element.onclick назначена функция, все в порядке. Мусор не собирается, но это нормально, потому что мы все еще используем объекты.

Как только мы назначаем

element.onclick = null; 

Затем закрытие будет удалено сборщиком мусора, так как элемент больше не указывает на него. В чем проблема?


person siemanko    schedule 28.01.2014    source источник
comment
Этот совет (о циклических ссылках с элементами DOM) основан на ошибочных браузерах многолетней давности. Тем не менее, по-прежнему рекомендуется не связывать ресурсы ненужными замыканиями. И в цитируемой статье не сказано опасно, просто будьте осторожны.   -  person RobG    schedule 28.01.2014


Ответы (1)


Дело в том, что в этом коде:

function foo(element, a, b) {
   element.onclick = function() { /* uses a and b */ };
}

element хранит ссылку на замыкание, а замыкание ссылается на element.

Теперь, если вы установите element в null, вы обычно ожидаете, что он будет собран мусором, поскольку кажется, что на него больше ничего не ссылается. Однако этого не произойдет, поскольку закрытие на самом деле все еще ссылается на него, что приведет к утечке памяти.

Решение, как указано в руководстве по стилю, состоит в том, чтобы убедиться, что замыкание не содержит ссылки на element.

person laurent    schedule 28.01.2014
comment
Что вы подразумеваете под установкой element на null? - person Beetroot-Beetroot; 28.01.2014