在Javascript 中使用閉包建立事件處理程序
在Javascript 程式設計中,在循環內建立事件處理程序是很常見的。但是,當使用像 select.onchange = function() 這樣的語法時,了解共享引用的潛在問題至關重要。
當使用此語法在循環內分配事件處理程序時,它可能會導致指向相同變數的所有事件處理程序,這些變數將包含循環內分配的最終值。這可能會導致將相同的參數傳遞給所有事件的事件處理程序,而不管各個迭代如何。
要解決此問題並防止共享變數引用,需要使用閉包。閉包涉及建立一個內部函數,該函數透過引用從外部函數捕獲變數。然後,這個內部函數可以用作事件處理程序,確保每個事件處理程序都有自己的對應循環迭代的變數副本。
對於問題中給定的範例,以下的程式碼示範如何實作一個閉包並將正確的參數傳遞給事件處理程序:
<code class="javascript">var blah = xmlres.getElementsByTagName('blah'); for(var i = 0; i < blah.length; i++) { var td = document.createElement('td'); var select = document.createElement('select'); select.setAttribute("...", "..."); select.onchange = function(s,c,a) { return function() { onStatusChanged(s,c,a); } }(select, callid, anotherid); td.appendChild(select); }</code>
在此程式碼中,內部匿名函數傳回用作事件處理程序的函數。函數內的 (s,c,a) 參數透過引用捕獲,確保每個事件處理程序都有自己唯一的變數集。這樣,當事件發生時,正確的參數將傳遞給 onStatusChanged 方法。
以上是在 JavaScript 循環中建立事件處理程序時,閉包如何協助避免共用參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!