下面的代码如果使用var,最后输出的是9。
var a = [];
for (var i = 0; i < 10; i++) {
var c = i;
a[i] = function () {
console.log(c);
};
}
a[6](); // 9为什么一直输出是9??
求高手详解,谢谢
var a = [];
for (var i = 0; i < 10; i++) {
let c = i;
a[i] = function () {
console.log(c);
};
}
a[6](); // 6 //为什么这次是6??
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
注意 let 为 ECMAScript 6新增的命令,在部分低版本浏览器不支持;
let 起到的作用就是申明了块范围变量;
这样console.log(c);就输出了 块范围变量 c
使用var方式定义的c 在for循环结束之后,已经变成了9;
而 a[0]-a[9] 方法中的 console.log(c); 这里的c 又指向了全局变量,所以就一直输出9了;
那么问题来了,这不是我想要的,我那个for循环有屁用啊!!
所以我们要让 console.log(c); 指向局部变量,这就要用到闭包了,
推荐看下变量对象的概念:变量对象(Variable Object)
因为闭包
var a = [];
for (var i = 0; i < 10; i++) {
var c = i;
a[i] = (function (u) {
return function(){
console.log(u);
}
}(c));
}
闭包的关系,赋值的时候自成作用域.
这样更好理解一点:
var a = [];
for (var i = 0; i < 10; i++) {
(function() {
var c = i;
a[i] = function() {
console.log(c);
};
})();
}