首页  >  问答  >  正文

javascript - ES6标准入门中let命令提到的for循环打印i是10,如果不用let怎么替换?

最近在读阮一峰老师的ES标准入门,读到第一章的时候提到了一段代码

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

这里用let就可以解决这个问题,但是如果用ES5的方法呢?IIFE可以做到,不过是立即打印出来。

阿神阿神2647 天前838

全部回复(4)我来回复

  • 扔个三星炸死你

    扔个三星炸死你2017-06-28 09:24:57

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

    闭包问题

    回复
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:24:57

    可以利用 自定义属性
    var a = [];
    for (var i = 0; i < 10; i++) {

      var a[i].n = i;//自定义一个属性  n 
      a[i] = function () {
        console.log(this.n);
      };

    }
    a[6](); // 6

    回复
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-28 09:24:57

    这个不关let什么事,我想提问者应该是想要输出6吧?

    但是你这提出来的问题,感觉和你想要的完全不搭边啊,我想帮你改提问描述也有点无能为力啊……

    这其实是闭包的问题,主要,我们先分析下为什么会输出10:

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

    for里面的i的作用于是整个外部区域,所以,当调用a[6]()的时候,其实运行的是console.log(i),而此时因为跑完循环,i的值是10,所以输出10。

    至于提问者说的,let可以解决,是因为,for里面,let声明的变量,作用于只在for内部,所以,不会因为循环跑完而使得i可以解决,是因为,for里面,

    声明的变量,作用于只在for内部,所以,不会因为循环跑完而使得i在全局作用域中为10。

    其实,这个问题真正考察的应该是闭包。

    var a = [];
    for(var i = 0; i < 10; i++) {
        (function() {
            [i] = function () {
                console.log(i);
            }
        })(i);
    }
    a[6]();
    let闭包的作用,类似于之前

    的作用,是将局部的变量相互隔离开而不至于污染外部的变量值,每一个闭包内,都是一个独立的区域,而闭包传参只用于闭包内部使用,所以也可以实现输出6的结果。🎜

    回复
    0
  • 天蓬老师

    天蓬老师2017-06-28 09:24:57

    可以采用闭包的方式
    http://www.softwhy.com/articl...
    这个文章的后半部分已经解释了你的疑问

    回复
    0
  • 取消回复