ES6--闭包数组i的值与var的作用域理解

探讨JavaScript中因变量作用域引发的常见错误,解析循环中闭包引用问题,及如何避免输出统一值的误区。

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

变量ivar命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,

变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i)

里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是 10。

以上是通俗的解释这段代码的原因

 

但是我想说的是有想过数组a的成员里面的i,指向的都是同一个i这句话对于a[i]里的i适用吗?

会不会有这么个想法,就是每次循环都是a[i]i的值同一个值

解释一下:

a[i] = function () {
console.log(i);
};

这里是对每个a[i]复制一个函数

只有当调用a[i]()这种格式才会被触发这个函数效果

也就是说

a[i] = function () {
console.log(i);
};

只是一个声明,并没有做console,log(i)输出操作

所以由于var声明的变量是全局的,所以最后用a[6]()传入的i值是循环最后赋值的i值

 

转载于:https://www.cnblogs.com/YKingcc/p/9987884.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值