为什么';这个javascript(jQuery)是否会进入无限循环?

为什么';这个javascript(jQuery)是否会进入无限循环?,jquery,javascript-events,loops,Jquery,Javascript Events,Loops,我在上阅读了一篇关于绑定和解除绑定事件的伟大文章(因为我是一个使用jQuery的js初学者),我对这部分代码感到完全困惑(为了简洁起见简化了代码): 为什么把同一个函数放在它自己里面,它不会一直执行到一个无限循环中?但是,它用于将事件重新绑定到元素 据我所知,你的例子会。但是,您的示例与您参考的网站上的示例不同 function addItemUnbind() { $('#list6 li.special button') .unbind('click') .bind('cl

我在上阅读了一篇关于绑定和解除绑定事件的伟大文章(因为我是一个使用jQuery的js初学者),我对这部分代码感到完全困惑(为了简洁起见简化了代码):


为什么把同一个函数放在它自己里面,它不会一直执行到一个无限循环中?但是,它用于将事件重新绑定到元素

据我所知,你的例子会。但是,您的示例与您参考的网站上的示例不同

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(){
$(“#list6 li.special button”)
.unbind('单击')
.bind('单击',函数()){
var$newLi=$(“
  • 特殊与新我是新的”
  • ”; $(this).parent()在($newLi)之后; addItemUnbind(); }); }

    在本例中,当用户单击按钮时会调用“addItemUnbind”。

    因为该调用在内部函数中

    例如,他在addItemUnbind()中做了一些事情,其中之一就是将一个函数绑定到一个按钮点击

    然后声明此函数,例如在addItemUnbind()中有:

    .bind('click', function() {
      var $newLi = $('<li class="special">special and new <button>I am new</button></li>');
      $(this).parent().after($newLi);
      addItemUnbind();
      }
    
    .bind('click',function(){
    var$newLi=$(“
  • 特殊与新我是新的”
  • ”; $(this).parent()在($newLi)之后; addItemUnbind(); }

    调用addItemUnbind()时,这里大括号内的代码不会计算,而是在单击时计算。

    答案隐藏在您取出的部分代码中。您发布的内容确实是一个无限循环。但是,下面是一个更完整(但仍然简化)的示例,从链接的博客文章中修改:

    function addItemUnbind() {
      bind('click', function() {
        addItemUnbind();
      });
    }
    
    对addItemUnbind的调用位于一个闭包内——一个新的匿名函数,它与创建它的addItemUnbind函数分离。对新函数的引用不是立即被调用,而是被传递到绑定函数中。因此,如果绑定函数看起来像这样:

    function bind(eventName, eventHandler) {
      eventHandler();
    }
    
    function bind(eventName, eventHandler) {
      this.events[eventName] = eventHandler; // save the event handler to call when an event happens
    }
    
    然后会有一个无限循环,因为对eventHandler的调用会返回addItemUnblind

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

    那就没问题了。它不调用addItemUnbind,它只是保存了一个函数的引用,以后会调用它。

    啊……就像很多事情一样……“观察丹尼尔!”。 诚然,在我认为事件处理工作的方式上也存在一种异常现象,这导致我在文章中略过了我认为我已经知道的内容。多亏了你仔细的解释,我现在看得很清楚了