美文网首页
js for 循环中的值为最后一个值

js for 循环中的值为最后一个值

作者: 施主画个猿 | 来源:发表于2018-08-31 16:43 被阅读0次

正常情况

for (var i=0;i<10;i++){
    console.log(i);
}
image.png

在看看容易让人产生疑惑的情况

var a = [];
for (var i = 0; i < 10; i++) {
  // 作用域a
  a[i] = function () {
    // 作用域b
    console.log(i);
  };
}
a[6](); // 10
image.png

没有像我们预想的出现6而是10。原因:for循环中头部使用var 定义变量i 时,它和循环体中的i 的作用域不是同级作用域,因此当for循环执行完毕后,并不会给每个循环都储存相对应的i的值。(注意,这种情况只有在循环体执行完时才会发生,直接在循环体中写同步执行的数据,是可以拿到对应的i的值的。也就是这种情况一般发生在循环体中存在执行函数,这个函数的触发执行时机是在for循环执行完毕后

解决办法

1. 自执行函数解决法(针对老浏览器)

var a = [];
for (var i = 0; i < 10; i++) {
  (function(j){
      a[j] = function () {
          // 作用域b
          console.log(j);
      };
  })(i) 
}
a[6]();//6
image.png

解决的思想就是 既然每轮循环的值无法储存,那我们就在每轮循环执行时,执行一个自执行的匿名函数,并且把此轮的i当做参数传递进去。这样就创建了一个新的作用域,新的作用域中会我们使用变量j来储存i的值。每轮循环都会创建自执行函数,因此j作用域是互相独立的.

2. let(针对 手机端,node 等支持es6的环境)

var a = [];
for (let i = 0; i < 10; i++) {
  // 作用域a
  a[i] = function () {
    // 作用域b
    console.log(i);
  };
}
a[6](); // 6
image.png

简单粗暴,es6的let就是为支持块级作用域而生,因此。。。。。

相关文章

网友评论

      本文标题:js for 循环中的值为最后一个值

      本文链接:https://www.haomeiwen.com/subject/hpzswftx.html