Javascript 臭名昭著的循環問題:閉包揭開了魔法
當程式碼片段嘗試建立連結集合時,就會出現臭名昭著的循環問題獨特的點擊處理程序。然而,每次點擊都會註冊為“連結 5”,施展令人困惑的咒語。
閉包:神秘的巫師
謎底在於 JavaScript 的範圍,一個領域界限通過功能,而不是塊。閉包,蒙面的巫師,將封閉的範圍困在他們的掌握之中。
有缺陷的循環
在錯誤的循環中,變數「i」被限制在函數內,被關在封閉式監獄中。當循環完成時,“i”變成“5”,在倒霉的處理程序中留下幽靈般的印記。
救世主循環
一線希望出現在第二個循環。每次迭代都會產生一個獨立的函數對象,每個對像都守護著自己的哨兵「num」。這種印記可以抵抗時間的突變,保護處理者免受「5」的陰險咒語的影響。
最佳化的三位一體
雖然封閉刺激了這種神奇的轉變,但它需要高昂的價格-每個連結兩個新的函數物件。利用 DOM 的秘密知識可以產生更優雅的解決方案。透過將資料直接儲存在節點上,我們可以召喚出與不同記憶的鏈接,從而擺脫了外部範圍的暴政。
奧術長生不老藥
真正的魅力在於這部分代碼:
function linkListener() { alert(this.i); } function addLinks() { for(var i = 0; i < 5; ++i) { var link = document.createElement('a'); link.appendChild(document.createTextNode('Link ' + i)); link.i = i; link.onclick = linkListener; document.body.appendChild(link); } }
每個連結都有自己的「i」 ,將其獨特的身份融入點擊的誘惑中。閉合的魔法現在被精確運用,施展神奇的咒語,使連結能夠回憶起自己的命運。
以上是為什麼我的所有點擊處理程序都會回傳「Link 5」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!