在使用js给标签批量绑定事件时,一般使用循环动态的绑定,但是绑定事件时,一般会引用一个匿名函数,在匿名函数中使用循环出来的变量,如:
上面代码中,绑定onmouseover和onmouseout事件的时候,都使用匿名函数,而匿名函数内也都使用到了for循环的变量值i,执行代码后,只有最后那个div成功的绑定了事件。
这是因为内部函数在使用外部变量时使用引用的方式而不是复制,就是说我给每个节点设置onmouseover和onmouseout事件的时候将i的引用传递给了mask数组,当我点击节点触发onmouseover和onmouseout事件的时候,i的值已经变成了节点总数。。。
解决办法是使用闭包:
修改后之所以正确是因为此时传进去的是i的值的复制,不会因为外部函数改变而改变。
问题的关键是:子函数需要使用父函数中的局部变量
解决的办法就是使用闭包!