Ответ скрывается в части кода, который вы вынули. То, что вы опубликовали, действительно бесконечный цикл. Однако вот более полный (но все еще упрощенный) пример, модифицированный из связанного сообщения в блоге:
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, он просто сохраняет ссылку на функцию, которая вызовет ее позже.