如下的html,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4。
闭包演示 产品 0
产品 1
产品 2
产品 3
产品 4
原因是初学者并未理解JavaScript的闭包特性。通过element.οnclick=function(){alert(i);}方式给元素添加点击事件。响应函数function(){alert(i);}中的 i 并非每次循环时对应的 i(如0,1,2,3,4)而是循环后最后 i 的值5。 或者说循环时响应函数内并未能保存对应的值 i,而是最后一次i++的值5。
解决方案如下:
1、将变量 i 保存给在每个段落对象(p)上
function init1() { var pAry = document.getElementsByTagName("p"); for( var i=0; i
2、将变量 i 保存在匿名函数自身
function init2() { var pAry = document.getElementsByTagName("p"); for( var i=0; i
3、加一层闭包,i 以函数参数形式传递给内层函数
function init3() { var pAry = document.getElementsByTagName("p"); for( var i=0; i
4、加一层闭包,i 以局部变量形式传递给内层函数
function init4() { var pAry = document.getElementsByTagName("p"); for( var i=0; i
5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)
function init5() { var pAry = document.getElementsByTagName("p"); for( var i=0; i
6、用Function实现,实际上每产生一个函数实例就会产生一个闭包
function init6() { var pAry = document.getElementsByTagName("p"); for( var i=0; i
7、用Function实现,注意与6的区别
function init7() { var pAry = document.getElementsByTagName("p"); for( var i=0; i