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

发布于 2022-09-05 08:59:56 字数 237 浏览 20 评论 0

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

眼泪淡了忧伤 2022-09-12 08:59: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

长亭外,古道边 2022-09-12 08:59: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在全局作用域中为10。

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

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

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

森罗 2022-09-12 08:59:57

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

日暮斜阳 2022-09-12 08:59:57
//闭包的方式,并且立即执行
var a = []
for (var i=0; i<10; i++) {
    a.push(function (temp) {
        return temp
    }(i))
}
console.log(a)     //[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
笔芯 2022-09-12 08:59:56
var a = [];
            for(var i = 0; i < 10; i++) {
                +function(i){
                    a[i] = function() {
                        console.log(i);
                    }
                }(i);
            };
a[6](); // 6

闭包问题

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文