2010-12-12 3 views
2

Я совершенно новый для Javascript, и я просто читал следующую статью.Что представляют собой объекты JavaScript и когда они уничтожаются?

можно определить АЯКС соединение один раз и повторно использовать его несколько раз, и начало и остановить его позже. Вот пример:

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

Теперь позже, если я хочу, чтобы сделать эту же АЯКС вызов еще раз, все, что я должен сделать это вызов:

myAjaxRequest.start(); 

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

+1

Нет. Если вы не измените объект 'myAjaxRequest' вручную, он будет доступен для жизни документа. (предполагая, что переменная является глобальной переменной) –

+1

Установите myAjaxRequest = null. Он должен делать gc, иногда зависит от браузера. – WaiLam

+0

А как насчет времени, управления памятью браузера или чего-то еще. Я думаю, что в этом случае переменная находится в пределах области функции обратного вызова изолированной программной панели YUI. Он загружает экземпляр модуля для этой переменной. Но допустим, что это глобальная переменная. – lisak

ответ

2

Его позор, на что был дан ответ в комментариях, потому что никто не закрывается (извините, страшный каламбур). @ Šime Vidas и @WaiLam заслуживают кредита, но я, по крайней мере, попытаюсь дать ответ:

Хотя у вас есть ссылка на объект (хотя переменная myAjaxRequest), она останется в памяти до тех пор, пока документ не будет выгружен. Если вы присвоите значение null вашей переменной (myAjaxRequest = null), и других ссылок на объект нет, тогда сборщик мусора вернет память, используемую для его хранения.

Ссылка может существовать, даже если myAjaxRequest является локальной переменной внутри функции. Функция может возвращать ссылку на локальную переменную, например, в качестве объекта собственности, например:

function sandbox() { 
    var myAjaxRequest = A.io.request(/* constructor... */); 

    return { 
     myRequest: myAjaxRequest 
    }; 
} 

var mySandbox = sandbox(); 
mySandbox.myRequest.start(); 

или он может возвращать ссылку через закрытия (excellent explanation here), например:

function sandbox() { 
    var myAjaxRequest = A.io.request(/* constructor... */); 

    return { 
     getRequest: function() { 
      return myAjaxRequest; 
     } 
    }; 
} 

var mySandbox = sandbox(); 
mySandbox.getRequest().start(); 

До тех пор, поскольку у вас есть ссылка на ваш объект, он не будет собирать мусор. Вы можете безопасно вызвать метод start до тех пор, пока страница не будет выгружена.

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