js中for循环输出值疑惑

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    return console.log(i)
    // alert(i);
  };
}
a[1]()
// 10

代码如上所示

想不明白,为什么输出的不是9,而是10
不是for循环10次,i的值从09吗?

阅读 5.2k
5 个回答

首先为什么不是9是10 9的那次循环结束不是要i++吗。i就等于10了呀!
第二,a数组里面放的是函数,函数只有在调用的时候才会被执行。你在for循环中根本就没有呗执行啊
只有在最后a[1]()这才被调用执行,此时i为10,所以是10

for循环执行的步骤你弄错了`for(var i = 0;i<10;i++){
内容
}`
第一步:初始条件,第二步:判断内容,第三步:判断条件成立执行循环体里的内容,第四步:最后一步才进行累加!!!所以当条件i = 9时条件还成立执行了循环体的内容后执行了for循环的第四步累加。当i=10的时候不符合循环条件跳出循环,所以为10.

不明白,那就把代码换成另一种姿势,你就明白了。

var a = [];
for (var i = 0; i < 10; ) {
  i++
  a[i] = function () {
    return console.log(i)
    // alert(i);
  };
}
a[1]()
新手上路,请多包涵

你的i是一个全局的变量,当你执行a[i]();的时候循环已经完成,i = 10;而执行函数 function(){console.log(i)}在当前函数的作用域中没有i,就回找到父级的i也就是10打印出来。

新手上路,请多包涵

以上的答案都只回答了一半。楼主你看一下js的闭包和变量引用的相关概念,就能明白了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题