2008-12-11 65 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

啊....就像很多事情一樣....「丹尼爾觀察!」。 不可否認的是,在我認爲事件處理工作的方式中出現了一種異常現象,這讓我忽略了我認爲我已經知道的那篇文章。感謝您的仔細解釋,我現在看得很清楚。

相關問題