最近在读阮一峰老师的ES标准入门,读到第一章的时候提到了一段代码
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
这里用let就可以解决这个问题,但是如果用ES5的方法呢?IIFE可以做到,不过是立即打印出来。
闭关修行中......
var a = []; for(var i = 0; i < 10; i++) { +function(i){ a[i] = function() { console.log(i); } }(i); }; a[6](); // 6
闭包问题
可以利用 自定义属性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
这个不关let什么事,我想提问者应该是想要输出6吧?
let
但是你这提出来的问题,感觉和你想要的完全不搭边啊,我想帮你改提问描述也有点无能为力啊……
这其实是闭包的问题,主要,我们先分析下为什么会输出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。
for
i
a[6]()
console.log(i)
至于提问者说的,let可以解决,是因为,for里面,let声明的变量,作用于只在for内部,所以,不会因为循环跑完而使得i可以解决,是因为,for里面,
var a = []; for(var i = 0; i < 10; i++) { (function() { [i] = function () { console.log(i); } })(i); } a[6]();
可以采用闭包的方式http://www.softwhy.com/articl...这个文章的后半部分已经解释了你的疑问
闭包问题
可以利用 自定义属性
var a = [];
for (var i = 0; i < 10; i++) {
}
a[6](); // 6
这个不关
let
什么事,我想提问者应该是想要输出6吧?但是你这提出来的问题,感觉和你想要的完全不搭边啊,我想帮你改提问描述也有点无能为力啊……
这其实是闭包的问题,主要,我们先分析下为什么会输出10:
for
里面的i
的作用于是整个外部区域,所以,当调用a[6]()
的时候,其实运行的是console.log(i)
,而此时因为跑完循环,i
的值是10,所以输出10。至于提问者说的,
声明的变量,作用于只在let
可以解决,是因为,for
里面,let
声明的变量,作用于只在for
内部,所以,不会因为循环跑完而使得i
可以解决,是因为,for
里面,for
内部,所以,不会因为循环跑完而使得i
在全局作用域中为10。let
闭包的作用,类似于之前的作用,是将局部的变量相互隔离开而不至于污染外部的变量值,每一个闭包内,都是一个独立的区域,而闭包传参只用于闭包内部使用,所以也可以实现输出6的结果。🎜可以采用闭包的方式
http://www.softwhy.com/articl...
这个文章的后半部分已经解释了你的疑问