Что переживают объекты JavaScript и когда они уничтожаются?
Я довольно новичок в Javascript, и я просто читал следующую статью.
Вы можете определить ajax-соединение один раз, многократно использовать его, а затем запускать и останавливать. Вот пример:
var myAjaxRequest = A.io.request('test.html', {
method: 'POST',
data: {
key1: 'value1'
}
});
Позже, если я захочу снова сделать тот же самый вызов ajax, все, что мне нужно сделать, это позвонить:
myAjaxRequest.start();
Что делать, если у меня была очень часто используемая страница аукциона, и я хотел использовать соединение myAjaxRequest для всех действий, которые пользователь выполняет со своего браузера. Каковы правила жизни экземпляра myAjaxRequest? Я полагаю, это уничтожается при обновлении страницы. Но что-нибудь еще разрушает это? Допустим, объект создан в песочнице YUI, но это не имеет значения.
1 ответ
Жаль, что на это ответили в комментариях, потому что никто не получил закрытие (извините, ужасный каламбур) @ Шиме Видас и @WaiLam заслуживают похвалы, но я по крайней мере постараюсь найти ответ:
Пока у вас есть ссылка на объект (хотя переменная myAjaxRequest
) он останется в памяти, пока документ не будет выгружен. Если вы присваиваете null вашей переменной (myAjaxRequest = null
), и нет никаких других ссылок на объект, тогда сборщик мусора освободит память, использованную для его хранения.
Ссылка может существовать, даже если myAjaxRequest
является локальной переменной внутри функции. Функция может возвращать ссылку на локальную переменную, например, как свойство объекта, например:
function sandbox () {
var myAjaxRequest = A.io.request(/* constructor... */);
return {
myRequest: myAjaxRequest
};
}
var mySandbox = sandbox();
mySandbox.myRequest.start();
или он может вернуть ссылку через замыкание ( отличное объяснение здесь), например:
function sandbox () {
var myAjaxRequest = A.io.request(/* constructor... */);
return {
getRequest: function () {
return myAjaxRequest;
}
};
}
var mySandbox = sandbox();
mySandbox.getRequest().start();
Пока у вас есть ссылка на ваш объект, он не будет собирать мусор. Вы можете смело звонить start
метод, пока страница не выгружена.