答案隐藏在您取出的部分代码中。您发布的内容确实是一个无限循环。但是,这是一个更完整(但仍然简化)的示例,从链接的博客文章中修改:
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,它只是保存对稍后将调用它的函数的引用。