for 循环中的 i 变量取值问题
1:如何点击某一个 li 的时候 alert 输出其index? <ul id="test"> <li>111</li> <li>222</li> <li>333</li> <li>444</li> </ul> window.onload = function(){ var oLis = document.getElementById("test").getElementsByTagName("li"); for(var i = 0;i < oLis.length;i ++){ oLis[i].onclick = function(){ alert(i); //每次都是4 } } } 解析:因为在for循环里面指定给oLis[i].onclick的事件处理程序,也就是onclick那个匿名函数是在for循环执行完成后(用户点击时)才被调用的。而调用时,需要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义,然后又到方法外部查找,此时有定义,但i的值是4(只有i大于4才会停止执行for循环),因此,就会取到该值——这正是闭包(匿名函数)要使用其外部作用域中变量的结果。而且,这也是由于匿名函数本身无法传递参数(故而无法维护自己的作用域)造成的.(比较啰嗦,可以看下面的解释) 其实是根据作用域链的原理