уничтожить функцию в JavaScript (JQuery) - PullRequest
5 голосов
/ 30 октября 2009

Есть ли кто-нибудь, кто знает, как уничтожить функцию javascript (jquery)? Я использую jquery "selectable", и вызов функции "edit" запускается по выбору события "stop".

Внутри этой функции «редактирования» у меня есть вложенные функции переключателя с большим количеством событий «щелчка» и у меня есть много функций в каждом событии "щелчок". Моя проблема в том, каждый раз, когда я запускаю «выбираемые» функции и события внутри функции «редактировать», снова запускаются, но предыдущие функции и события все еще существуют. То, что я делаю сейчас, это открепляем каждое событие в функции «редактировать» даже на выбираемом «старте».

Это проблема утечки памяти? и есть ли способ "уничтожить" функции в javascript? Я пытался объявить функцию, чтобы обнулить, когда функция заканчивается, но это не работает. функции и события внутри него все еще существуют.

У кого-нибудь есть подсказка?

демонстрационная страница здесь -> http://dreamerscorp.com/test/test01/javascript_destory_test.html

изменить 2009/10/31 :) Большое спасибо за вашу помощь, ваши комментарии очень полезны для меня, еще раз спасибо !!!

Ответы [ 4 ]

8 голосов
/ 30 октября 2009

Вы можете попытаться аннулировать функцию или переопределить ее, назначив анонимную функцию, которая ничего не делает:

myFunction = null;
// or 
myFunction = function () {};

Вы также можете сделать это внутри самой функции:

var autoDestroy = function () {
  autoDestroy = null;
  //...
  return 1;
};

autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function
6 голосов
/ 30 октября 2009

для отмены привязки событий в jquery используйте функцию unbind http://docs.jquery.com/Events/unbind

$("something").click(function() {
    $("anotherOne").click(function() {
         ....
    });
});

в этом примере каждый раз, когда нажимается «что-то», в «anotherOne» добавляется обработчик события, поэтому, если вы нажмете три раза, вы получите три обработчика события.

$("something").click(function() {
    $("anotherOne").unbind('click').click(function() {
         ....
    });
});

здесь вы гарантированно имеете только один обработчик кликов на "anotherOne".

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

4 голосов
/ 30 октября 2009

В основном вам нужно удалить все ссылки на эти функции, чтобы сборщик мусора JavaScript мог их собрать. Если они связаны, вам нужно их отменить. Если там есть другие переменные, которые указывают на них, они должны быть установлены в нуль.

Может помочь, если вы разместили какой-то код; тогда мы можем дать лучший ответ.

... EDIT:

Что здесь происходит, вы создаете замыкание, которое переживет содержащуюся функцию:

    function edit(){
      $('.edit').click(function(){
        //...
        function _edit(boxTitle,selectedItemAmount){
          //...
          $('#box .yes').click(function(){
            alert(boxTitle + ' for ' + selectedItemAmount + ' selected item');
            $('#msg').hide(); // hide msg box when yes btn is clicked
          });
        }
        //...
        $('#box .no').click(function(){
          $('#msg').hide();
        });
      });

Другими словами, внутри функции вы говорите: «Присоедините эту функцию к объекту DOM», и вы делаете это встроенным образом. JavaScript захватывает переменные из внешних контекстов и сохраняет их живыми, пока ссылка на внутренний контекст жива.

Что вам нужно сделать, это определить функции где-то не встраиваемые, а затем использовать их:

    function boxClickYes(e) {
      alert(e.data.boxTitle + ' for ' + e.data.selectedItemAmount +
        ' selected item');
      $('#msg').hide(); // hide msg box when yes btn is clicked
    }
    function boxClickNo(e) {
      $('#msg').hide();
    }
    function edit(){
      $('.edit').click(function(){
        //...
        function _edit(boxTitle,selectedItemAmount){
          //...
          $('#box .yes').bind("click", {boxTitle: boxTitle,
            selectedItemAmount: selectedItemAmount}, boxClickYes);
        }
        //...
        $('#box .no').click(boxClickNo);
      });

Это также демонстрирует, как использовать свойство data в обработчиках кликов jQuery для хранения данных между временем, когда вы присоединяете обработчик, и временем, когда вы его используете (вместо того, чтобы хранить эти данные в замыкании, которое сохранит цепочку областей в памяти ). Использование встроенных функций хорошо, когда вы просто используете его прямо здесь (например, тело $.each), но это не нормально, когда вы присоединяете обработчики событий.

1 голос
/ 30 октября 2009

Чтобы «уничтожить» функцию в javascript, просто убедитесь, что функция становится недоступной. Это позволит функции иметь право на восстановление. Следует обратить внимание на то, что переменные javascript связаны на основе областей (не как отдельных переменных), и область действия со многими неиспользуемыми объектами может сохраняться, если привязка сохраняется к области действия: для оказания дополнительной помощи требуется знание конкретного кода и способа его использования.

Пожалуйста, смотрите оператор удаления javascript как один из способов удаления переменной или члена объекта. Установка значения в null / undefined / other-object удаляет метод достижения объекта, на который ранее ссылались (хотя он все еще может быть достигнут иным образом и, следовательно, не может быть возвращен), но не избавляет от переменной / member.

delete variable
delete obj.member
delete obj[member]
...