Сборка мусора и jQuery? - PullRequest
       1

Сборка мусора и jQuery?

3 голосов
/ 14 ноября 2011

Как работают jQuery (JavaScript) и gc?

callBack - это функция, которая запускается как обратный вызов для ответа JSON.

Что будет в памяти после выполнения функции callBack?

Я хотел бы услышать, что объект данных и autoCompleteData будут собирать мусор.И только данные, хранящиеся в $("input#reciever"), хранятся в памяти.

Так ли это?

//The code in question:

var callBack = function(data) {
    var autoCompleteData = jQuery.map(data.receivers, function(receiver, i){
          return {label: receiver.name, id: receiver.id };
    });

    $("input#reciever").autocomplete({
        source: autoCompleteData,
        select: function(event, receiver) {
            $("input#reciever").val(receiver.item.label); 
            $("input#recieverId").val(receiver.item.id);
            return false;
        }

    });
}

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Сборка мусора в Javascript работает за счет освобождения памяти любого объекта, на который не ссылается ни один другой код javascript.Если ни у кого нет ссылки на него, он больше не может использоваться, поэтому его можно безопасно освободить.

Ссылки на объект могут быть из переменной или из области действия, которая все еще активна.

В приведенном выше примере, пока вы ожидаете завершения функции .autocomplete (), все в вашем коде все еще находится в области видимости и ничего не будет собираться мусором.Это означает, что autoCompleteData будет сохраняться (а не собираться мусором) до тех пор, пока метод .autocomplete() не будет полностью завершен.Это нормально, ожидаемо и фактически требуется для правильной работы во многих местах.

В качестве меры одной из причин, по которой эти данные все еще находятся в области видимости, переменная autoCompleteData все еще находится в области видимости в select функция обратного вызова.Было бы правильно и правильно ссылаться на эту переменную в функции обратного вызова select.Таким образом, движок JS не должен собирать мусор до тех пор, пока он больше не будет находиться в области видимости и на него больше не будет ссылаться какой-либо код.

В некоторых случаях вы можете сделать память доступной для сборки мусора, явно очистивпеременная.

Например, если вы реструктурировали свой код следующим образом:

var callBack = function(data) {
    $("input#reciever").autocomplete({
        source: jQuery.map(data.receivers, function(receiver, i){
          return {label: receiver.name, id: receiver.id };,
        select: function(event, receiver) {
            $("input#reciever").val(receiver.item.label); 
            $("input#recieverId").val(receiver.item.id);
            return false;
        }

    });
}

Тогда данные автозаполнения существуют только в качестве аргумента для .autocomplete() и могут иметь право на сборку мусора.как только ядро ​​JS не потребует хранить эти данные до тех пор, пока не будет вызван обратный вызов select, как это было раньше.Будь данные на самом деле сборщиком мусора сразу же, зависит от того, хранит ли внутренняя реализация .autocomplete () их где-то, что длится до вызова метода select или нет.

FYI, точная синхронизация мусорасбор данных имеет наибольшее значение с большими порциями данных (много мегабайт), миллионами порций данных (множество порций данных, которые в сумме составляют сотни мегабайт. Если размер чего-либо измеряется в килобайтах или даже сотнях килобайт, и есть толькоВо-первых, точное время, когда память собирается сразу же или когда вызывается обратный вызов, на самом деле не так уж важно, так как браузеры в наши дни имеют доступ к разумному объему памяти. Если вы имели дело с гигантскими порциями данныхили иметь дело с миллионами из них или делать что-то многократно и иметь какую-то утечку, все это может вызвать проблемы (особенно на мобильном телефоне), но пример, как у вас выше, вряд ли вызовет проблему, еслинабор большой относительно памяти, доступной в браузере.

1 голос
/ 14 ноября 2011

Объекты передаются по ссылке в JavaScript, поэтому объект, к которому был получен доступ к autoCompleteData, будет тем же, который используется плагином autocomplete.

Из-за этого переменная autoCompleteData не будетбыть сборщиком мусора (но это не вредно для вашей программы, так как этого требует плагин автозаполнения.

Однако объект data должен быть сборщиком мусора, так как ничто не предоставляет ссылку на него, и этовыпал из области видимости.

Кроме того, важно отметить, что сборка мусора не работает по-разному для jQuery, она ведет себя так же, как и в JavaScript (и, конечно, во всех других средах JavaScript).

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