一个怪异的问题,,求高手解惑
- HTML code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> </head> <body><input type="text" name="wb" /><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><script>function change(obj){ alert(obj);//这里的i是6 }(function(){ var array = document.getElementsByName('wb'); for(var i=0;i<array.length;i++){ //alert(i);这里面i的值是012345; array[i].attachEvent("onmouseover",function(){ alert(i); //这里的i是6 change(array[i]);}); } change(i);})();</script> </body></html>为啥i最后的值是6啊,,为啥i在for循环外面还可以用啊?求高手,,,,,,,,
[解决办法]
js不存在块级作用域 只要是在函数内定义的变量则整个函数都可以访问 所以i在for循环外面(但要在对应都的函数里面)还可以用 至于为啥是6 因为i本来是5 i++后变成6
[解决办法]
为啥i最后的值是6啊
因为for循环的执行过程,在最后一次循环(i=5)后,还要执行一次i++,然后判断条件i<array.length,发现不满足,于是退出循环,所以循环结束后i=6
至于在for循环外部使用,这是js的问题了,i实际上相当于在外部定义的
var i;
for(i=0;i<array.length;i++)
所以
for(var i=0,abc=123;i<array.length;i++)
{
}
alert(abc);
像这种,abc也是可以在后面访问到的.....
[解决办法]
for(var i=0;i<array.length;i++)
这句话你理解清楚了没啊,红色部分就是普通的定义变量,又没人说出了循环就销毁变量
蓝色部分是在一次循环结合后执行的,i等于5时,进入循环,然后结束循环时执行i++,i=6,此时就不符合进入循环的条件了
别人家这么写你也这么写,先理解了意思。
- HTML code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> </head> <body><input type="text" name="wb" /><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><script>function change(obj){ alert(obj);//这里的i是6 }(function(){ var array = document.getElementsByName('wb'); for(var i=0;i<array.length;i++){ //alert(i);这里面i的值是012345; /* array[i].attachEvent("onmouseover",function(){ alert(i); //这里的i是6 change(array[i]);}); */ (function(key){ array[key].onmouseover = function(){alert(key)}; })(i) }})();</script> </body></html>
[解决办法]
饿 第二个问题1楼理解得正确
for循环是没有自己的作用域
for(var i=0;i<=3;i++)
{
var aaa=i;
}
alert(aaa);
这样也都可以访问
[解决办法]
循环时,只执行了attachEvent 函数,绑定事件。
onmouseover 时 才执行
function(){
alert(i); //这里的i是6
change(array[i]);});
}
这时循环肯定执行完毕了,所以i 是 6.
var array = document.getElementsByName('wb');
for(var i=0;i<array.length;i++){
array[i].index=i;
array[i].attachEvent("onmouseover",function(){
alert(this.index);
});
}
[解决办法]
用闭包解决此问题:
- JScript code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> </head> <body><input type="text" name="wb" /><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><script>function change(obj){ alert(obj);//这里的i是6 }(function(){ var array = document.getElementsByName('wb'); for(var i=0;i<array.length;i++){ //alert(i);这里面i的值是012345; array[i].attachEvent("onmouseover",(function(j){ return function(){ alert(j); change(array[j]); } })(i)); } //change(i);})();
[解决办法]
- JScript code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title> New Document </title> <meta name="Generator" content="EditPlus"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> </head> <body><input type="text" name="wb" /><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><input type="text" name="wb"/><script>function change(obj){ alert(obj);//这里的i是6 }(function(){ var array = document.getElementsByName('wb'); for(var i=0;i<array.length;i++){ //alert(i);这里面i的值是012345; array[i].attachEvent("onmouseover",(function(j){ return function(){ alert(j); change(array[j]); } })(i)); } //change(i);})();</script> </body></html>