Heim > Fragen und Antworten > Hauptteil
Kürzlich habe ich die Einführung in ES-Standards von Lehrer Ruan Yifeng gelesen und als ich das erste Kapitel gelesen habe, habe ich einen Code erwähnt
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
Die Verwendung von let hier kann dieses Problem lösen, aber was ist, wenn wir die ES5-Methode verwenden? IIFE kann es, aber es druckt es sofort.
扔个三星炸死你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
闭包问题
巴扎黑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
曾经蜡笔没有小新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
在全局作用域中为10。
其实,这个问题真正考察的应该是闭包。
var a = [];
for(var i = 0; i < 10; i++) {
(function() {
[i] = function () {
console.log(i);
}
})(i);
}
a[6]();
闭包的作用,类似于之前let
的作用,是将局部的变量相互隔离开而不至于污染外部的变量值,每一个闭包内,都是一个独立的区域,而闭包传参只用于闭包内部使用,所以也可以实现输出6的结果。