Что переживают объекты JavaScript и когда они уничтожаются? - PullRequest
2 голосов
/ 12 декабря 2010

Я довольно новичок в Javascript, и я просто читал следующую статью.

вы можете определить соединение ajax один раз, и использовать его несколько раз, и начать и остановить это позже. Вот Пример:

var myAjaxRequest = A.io.request('test.html', {
    method: 'POST',
    data: {
      key1: 'value1'
    }
});

Теперь позже, если я захочу это сделать снова тот же вызов ajax, все что мне нужно сделать это вызов:

myAjaxRequest.start();

Что, если у меня была очень часто используемая страница аукциона, и я хотел использовать соединение myAjaxRequest для всех действий, которые пользователь выполняет со своего браузера. Каковы правила жизни экземпляра myAjaxRequest? Я полагаю, это уничтожается при обновлении страницы. Но разрушает ли это что-нибудь еще? Допустим, объект создан в песочнице YUI, но это не имеет значения.

1 Ответ

2 голосов
/ 25 февраля 2011

Жаль, что на это ответили в комментариях, потому что никто не получил закрытие (извините, ужасная игра слов) @ Шиме Видас и @WaiLam заслуживают похвалы, но я по крайней мере постараюсь найти ответ:

Пока у вас есть ссылка на объект (хотя переменная myAjaxRequest), он будет оставаться в памяти, пока документ не будет выгружен. Если для переменной (myAjaxRequest = null), и назначено значение 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, пока страница не будет выгружена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...