for循环中的i
bar中的i赋值为3
在运行时是给for循环中的i赋值了?
bar中的i赋值为3
在运行时是给for循环中的i赋值了?
2015-12-12
我给你解释一下吧,希望能解释清楚。。
function foo(){ function bar(){ i = 3; console.log(i); } for(var i = 0;i<10;i++){ bar(i * 2); } } foo();
由于局部变量声明提前,上面的代码相当于:
function foo(){ var i; // js 引擎把变量声明提前了,但是并没有初始化 function bar(){ i = 3; // 这个i变量是foo的局部变量,而不是bar的局部变量 console.log(i); } // 执行for循环时,i才初始化,此时i=0 // 然后满足条件(0<10),进入循环 // 在循环内部,调用bar函数,并把 i*2 作为实参传入(其实传不传参数都一样,可能是为了迷惑你) // 调用bar函数时,在内部引用了 i 变量,且这个 i 变量并不是bar函数的局部变量(因为没有用var) // bar内部的 i 变量其实时 bar 的上层执行环境即foo内的变量(如果你理解作用域和作用域链的话) // bar函数执行完,会把foo的i变量变为3 // -------------死循环开始了 // i++ 执行完,此时 i = 4 // 4<10,满足条件,再一次进入循环, // 再次调用bar函数,又把i变成了3 // i++ 执行完,此时 i = 4 // 4<10,满足条件,再一次进入循环, // 再次调用bar函数,又把i变成了3 // i++ 执行完,此时 i = 4 // 4<10,满足条件,再一次进入循环, // 再次调用bar函数,又把i变成了3 // . // . // . for(i = 0;i<10;i++){ bar(i * 2); } } foo();
希望我上面的分析你看明白了。。下面再说一下这个问题的变体。。
function foo(){ function bar(){ var i = 3; // 注意,与上面唯一不同是i前面有var console.log(i); } // 由于bar中的i变量使用了var声明,那么,bar中的i就是局部变量,与foo中的i不是同一个变量 // 虽然两者名字相同,但绝不是同一个变量!!!记住!!! // 所以调用bar之后,改变的是bar内部的i,并不会影响foo中的i。。 // 所以for循环能正确执行,你会看到for循环如你所愿执行了10次。。 for(var i = 0;i<10;i++){ bar(i * 2); } } foo();
额。。。作用域与作用域链是javascript中的难点和重点,需要一段时间来理解,如果你理解了他们的话,我上面的分析你差不多能看懂。如果不理解,请多关注这方面的知识点,攻坚一下。。然后在回来看这个问题你会豁然开朗。。。
举报