2008-12-11 102 views
2

我读到有关绑定和解除绑定事件(因为我使用jQuery一个js初学者)上Karl Swedberg's blog伟大的文章,和我成为了这部分代码完全困惑(简化为简洁起见):为什么不这个JavaScript(jQuery)进入无限循环?

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

为什么通过把相同的功能放在自身内部,它不会继续执行到无限循环?但是,它用于将事件重新绑定到元素...!?

回答

3

因为呼叫是在一个内部函数内。

E.g.他在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()被调用这里的大括号中的代码不被分析而是点击时会发生。

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'。

0

答案隐藏在你拿出的部分代码中。你发布的内容确实是一个无限循环。但是,这里有一个更完整的(但仍然简体)例如,从链接的博客文章修改:

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

到addItemUnbind电话是瓶盖内 - 一个新的匿名功能,这是从创建它的addItemUnbind功能分开。不是马上被调用,而是将新函数的引用传递给绑定函数。因此,如果绑定功能是这样的:

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

,那么你就会有一个无限循环,因为调用事件处理程序将导致回addItemUnblind。但是,如果它看起来像这样:

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

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

0

啊....就像很多事情一样....“丹尼尔观察!”。 不可否认的是,在我认为事件处理工作的方式中出现了一种异常现象,这让我忽略了我认为我已经知道的那篇文章。感谢您的仔细解释,我现在看得很清楚。