Understand memory leaks in JavaScript applications / Понимание утечек памяти в приложениях на JavaScript: Утечка памяти 1: Замыкания

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Один из самый простых способов создать "утечку" объекта – создать интервал или таймаут, колбэк которого ссылается на объект. Для достижения подобного результата обновите leaker.js в соответствии с листингом 4.

Stutzer 24.01.13 в 02:39

0

Листинг 4. assets/scripts/leaker.js

Stutzer 24.01.13 в 02:39

0

Теперь, если вы повторите шаги с первого по девятый из предыдущей части, на третьем снимке вы обнаружите, что объект типа Leaker все еще присутствует, а интервал продолжает исполняться бесконечно. Итак, что же произошло? Если сослаться на локальную переменную из замыкания, она остается в памяти до тех пор, пока замыкание существует. Чтобы обеспечить выполнение колбэка в методе setInterval с доступам к области видимости внешнего объекта типа Leaker, переменная this присваивается локальной переменной self, которая используется для вызова onInterval изнутри замыкания. Когда onInterval исполняется, он имеет доступ к любым переменным объекта Leaker, включая преременную self. Тем не менее, объект Leaker не уничтожается сборщиком мусора до тех пор, пока обработчик события существует.

Stutzer 24.01.13 в 03:05

0

Чтобы исправить эту ситуацию, нужно выполнить метод destroy, который был добавлен к классу Leaker, прежде, чем присваивать null переменной leak, которая является ссылкой на наш объект. Для этого необходимо обновить обработчик, висящий на кнопке Destroy, согласно листингу 5.

Stutzer 24.01.13 в 03:09

0

Листинг 5. assets/scripts/main.js

Stutzer 24.01.13 в 03:09

0
Минутку...