Understand memory leaks in JavaScript applications / Понимание утечек памяти в приложениях на JavaScript: Утечка памяти 1: Замыкания
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Один из самый простых способов создать "утечку" объекта – создать интервал или таймаут, колбэк которого ссылается на объект. Для достижения подобного результата обновите leaker.js в соответствии с листингом 4. Stutzer 24.01.13 в 02:39 |
|
|
Листинг 4. assets/scripts/leaker.js Stutzer 24.01.13 в 02:39 |
||
|
Теперь, если вы повторите шаги с первого по девятый из предыдущей части, на третьем снимке вы обнаружите, что объект типа Leaker все еще присутствует, а интервал продолжает исполняться бесконечно. Итак, что же произошло? Если сослаться на локальную переменную из замыкания, она остается в памяти до тех пор, пока замыкание существует. Чтобы обеспечить выполнение колбэка в методе setInterval с доступам к области видимости внешнего объекта типа Leaker, переменная this присваивается локальной переменной self, которая используется для вызова onInterval изнутри замыкания. Когда onInterval исполняется, он имеет доступ к любым переменным объекта Leaker, включая преременную self. Тем не менее, объект Leaker не уничтожается сборщиком мусора до тех пор, пока обработчик события существует. Stutzer 24.01.13 в 03:05 |
||
|
Чтобы исправить эту ситуацию, нужно выполнить метод destroy, который был добавлен к классу Leaker, прежде, чем присваивать null переменной leak, которая является ссылкой на наш объект. Для этого необходимо обновить обработчик, висящий на кнопке Destroy, согласно листингу 5. Stutzer 24.01.13 в 03:09 |
||
|
Листинг 5. assets/scripts/main.js Stutzer 24.01.13 в 03:09 |
