日期:2014-05-16  浏览次数:20480 次

for in多重循环变量作用域的问题
在for多重循环里最外层循环变量在内部是能被修改的,但最近在使用for in时发现不一样,下面代码大家可以放到chrome console里试试

var a=["123","sdf"],b=["sd","ss","ee"];
for(i in a){console.log(i+"--1");for(i in b){console.log(i+"--2");}console.log(i+"--3")}

发现输出结果是这样
0--1 VM563:2
0--2 VM563:2
1--2 VM563:2
2--2 VM563:2
2--3 VM563:2
1--1 VM563:2
0--2 VM563:2
1--2 VM563:2
2--2 VM563:2
2--3 VM563:2

外部的循环变量i不受内部循环的值的影响,求解,先谢过。
------解决方案--------------------
很简单啊
在for(var i=0; i<a; i++)中,循环的流程完全都是i控制的。改变i的值就改变了循环的流程。
在for (var i in o)中,i只是用来接收对象的属性名称,循环的流程不是i控制,改变i的值不影响循环的流程

------解决方案--------------------
引用:
想了一下又不太对, 如果内部变量比外部变量优先级高的话, 当循环到外部的时候变量应该是取到原先外部变量的值
那么 --3那里应该跟--1的值相对应
模糊了

js中没有“块作用域”,只有“函数作用域”
------解决方案--------------------
引用:
Quote: 引用:

很简单啊
在for(var i=0; i<a; i++)中,循环的流程完全都是i控制的。改变i的值就改变了循环的流程。
在for (var i in o)中,i只是用来接收对象的属性名称,循环的流程不是i控制,改变i的值不影响循环的流程

是说每次在内外层循环时,都是通过属性给i赋值,这样内外层的i值不会相互影响是吗。如果是这样有些奇特了,js能够知道它内外部的属性轮询到哪个属性了是吗,不需要一个类似i的值做记录?

不是内外层的i不会相互影响,而是改变i的值也不会影响循环的流程,影响的只是i变量本身