Почему этот Javascript (JQuery) идти в бесконечный цикл?

голоса
2

Я читал большую статью о связывании и разряжение событий (потому что я новичок JS с помощью JQuery) на блоге Карлы Сведберг в , и я стал полностью озадачен этой частью коды (упрощено для краткости):

    function addItemUnbind() {
      $Add a button but it won't have it's event added;
      addItemUnbind();
  });

Почему это, что, поставив ту же функцию в себе это не мешает выполнения в бесконечный цикл? Тем не менее, она используется повторно связать событие элемента ...!?

Задан 11/12/2008 в 04:13
источник пользователем
На других языках...                            


4 ответов

голоса
9

Насколько я могу сказать, что ваш пример будет. Однако ваш пример не то же самое, как, например, на сайте вы ссылаетесь.

function addItemUnbind() {
  $('#list6 li.special button')
    .unbind('click')
    .bind('click', function() {
      var $newLi = $('<li class="special">special and new <button>I am new</button></li>');
      $(this).parent().after($newLi);
      addItemUnbind();
  });
}

В этом примере «addItemUnbind» вызывается, когда пользователь нажимает на кнопку.

Ответил 11/12/2008 в 04:22
источник пользователем

голоса
3

Поскольку вызов в пределах внутренней функции.

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

Эта функция затем объявляется, например, в addItemUnbind () есть:

.bind('click', function() {
  var $newLi = $('<li class="special">special and new <button>I am new</button></li>');
  $(this).parent().after($newLi);
  addItemUnbind();
  }

Код в фигурных скобках здесь не оценивается при addItemUnbind () вызывается, а когда щелчок происходит.

Ответил 11/12/2008 в 04:23
источник пользователем

голоса
0

Ах .... как в много вещей .... «наблюдение Даниэля!». Правда тоже была аномалия в том, как я думал, обработка событий работала, которое заставило меня обезжиренное статью по поводу того, что я думал, что я уже знал. Я вижу ясно теперь, благодаря вашим тщательным объяснениям.

Ответил 11/12/2008 в 05:27
источник пользователем

голоса
0

Ответ скрывается в части кода вы приняли. Что Вы отправили действительно бесконечный цикл. Тем не менее, вот более полный (но упрощенный) пример, модифицированный из связанного в блоге:

function addItemUnbind() {
  bind('click', function() {
    addItemUnbind();
  });
}

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

function bind(eventName, eventHandler) {
  eventHandler();
}

то вы бы бесконечный цикл, так как вызов EventHandler приведет обратно в addItemUnblind. Но если это выглядит следующим образом:

function bind(eventName, eventHandler) {
  this.events[eventName] = eventHandler; // save the event handler to call when an event happens
}

то нет никаких проблем. Это не вызывает addItemUnbind, он просто сохраняет ссылку на функцию, которая будет вызывать его в дальнейшем.

Ответил 11/12/2008 в 04:31
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more