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中文网其他相关文章!