变量作用域链
var Odiv = document.getElementsByTagName("div") for(var i=0;i<3;i++){ Odiv[i].onclick = function(){alert(i)} }//当点击Odiv[i]的时候,alert(i)弹出来的是3,因为当这个方法运行时循环已经循环完毕
内部的方法使用外部的变量,会以外部变量最后一个值为准。
//Odiv[i]是for循环就运行,alert(i):是定义了没运行,onclick的时候才运行,所以alert弹出5
//匿名方法:()()第一个()是定义方法,第二个()是运行方
解决以上问题的办法
1 var Odiv = document.getElementsByTagName("div")
2 //这个方法是先运行as(),然后将as方法中的所有循环为false时跳出
3 function as(){
4 for(var i=0;i<3;i++){
5 Odiv[i].onclick = function(){alert(i)}
6 }
7 }
8 as();
9 //循环开始时执行(i),(i)的值传给function(k),这是一个匿名方法的运行。
10 //其实就是一个闭包的作用,将外部的变量和内部的变量隔离开。
11 for(var i=0;i<3;i++){
12 (function(k){
13 Odiv[k].onclick = function(){alert(k)}
14 })(i)
15 }