给多个节点绑定事件时遇到了JS闭包问题

下面的程序想实现功能:创建 10li 节点,添加到 id="ulist"ul 中,当鼠标经过每个 li 节点时,就在显示区添加一句 pass + (li 节点的标号 )

<ul id="ulist"></ul>

<div id="show"></div>

<script>

dojo.addOnLoad(function() {

       for(var i=0;i<10;i++){

              var a = dojo.doc.createElement("li");

              a.innerHTML = "item " + i;

              dojo.connect(a,"mouseover", function(){

show.innerHTML = show.innerHTML + "<br/> pass " + i;

} );

              ulist.appendChild(a);

       }

});

</script>

 

上述代码并没有达到要求,鼠标经过任一个 li 节点时,显示区就多一句 “pass 10”

问题出在给 mouseover 绑定的响应函数上,当鼠标经过任一个 li 节点时,就去执行代码中的匿名函数

function(){

show.innerHTML = show.innerHTML + "<br/> pass " + i;

}

i 源于该匿名函数定义时所在的环境,在该环境中 i 的值随着 for 循环从 0 增长到 10 ;到后来匿名响应函数执行时, i 的值是 10 ,而不是像期望的那样去反映 li 的标号。

修正方法:给每个 li 绑定一个新建的函数,新建的函数中使用的变量不依赖 i 。将代码中的蓝色部分改为

              function getFun(k){

                     return function(){ show.innerHTML = show.innerHTML + "<br/> pass " + k;}

              }

              dojo.connect(a,"mouseover", getFun(i));

或者合并为

dojo.connect(a,"mouseover", (function(k){

                     return function(){ show.innerHTML = show.innerHTML + "<br/> pass " + k;}

                     })(i));

都是可行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值