为何for循环执行完毕后变量age会自增为11?结合var与let作用域的技术疑问
为什么for循环结束后变量age会变成11?
先看你给出的这段代码:
var age = 15; // 初始化age为1的for循环,当age为10时循环结束并输出10 for (var age = 1; age <= 10; age++) { console.log(age); } // 后续的console.log输出时age已自增为11 console.log(age);
其实核心原因要从for循环的执行流程和var的作用域特性两个角度来看:
1. var的作用域问题
var没有块级作用域,所以循环里声明的var age和最外层的var age是同一个变量——也就是说,循环一开始就把外层的age从15覆盖成了1。
2. for循环的执行步骤拆解
for循环的三个部分(初始化、条件判断、递增)是按固定顺序执行的:
- 第一步:执行初始化语句
var age = 1,此时age的值变为1。 - 第二步:检查条件
age <= 10,如果满足就进入循环体执行console.log(age),执行完循环体后再执行age++。 - 当age等于10的时候:
- 条件
10 <= 10成立,进入循环体输出10; - 紧接着执行
age++,age变成11; - 接下来回到条件判断,检查
11 <= 10,不成立,循环直接结束。
- 条件
这时候age已经是11了,所以最后外层的console.log(age)自然输出11。
至于你提到的用let的情况,因为let有块级作用域,循环里的age是块内的局部变量,和外层的age完全独立,所以循环结束后外层的age还是最初的15,循环外输出15就不奇怪了。
内容的提问来源于stack exchange,提问作者martinbshp
相关产品推荐
相关产品推荐

