2014-02-06 7 views
3

Мне любопытно, как с памятью обрабатываются переменные внутри замыканий. Возьмите этот код, например -Блокировка JavaScript и управление памятью

function iAmAClosure() { 
    var txtName = document.getElementById('name'); 

    function validation() { 
     if (txtName.value.length === 0) { 
      return false; 
     } 
     return true; 
    } 

    document.getElementById('submit').onclick = function() { 
     return validation(); 
    } 
} 

Моя validation функция вызывается всякий раз, когда пользователь нажимает на кнопку.

Вопрос в том, изменяет ли переменная txtName в памяти, пока страница активна, или она GC'ed и инициализируется каждый раз, когда вызывается валидация метода? Есть ли что-то еще для этого?

Какова эффективность работы?

+1

Закрытие не имеет значения, если var недоступен, он будет собран. – dandavis

+0

«Производительность» зависит от мощности обработки и размера памяти. Вы не можете сказать, что лучше вообще. Но обратите внимание, что для его инициализации каждый раз вам нужно будет явно перевести код в вашу функцию 'validation' - поведение корректно определено. – Bergi

+0

@ dandavis: Вот почему закрытие имеет значение - оно делает переменную достижимой :) – Bergi

ответ

4

Любые переменные в замыкании функции сохраняются в памяти, пока существует способ ссылки на эту функцию. Здесь txtName находится в закрытии вашей функции onclick, поэтому он останется в памяти, пока привязка onclick не повреждена и кнопка «отправить» существует.

+0

Спасибо. Один последний вопрос. Каким будет ваше наилучшее обоснованное предположение о том, сколько памяти я могу использовать до того, как страница станет медленной? Также лучше ли использовать инструмент chrome dev для тестирования использования моей памяти? –

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