var
1. `var a = [];`
1. `for (var i = 0; i < 10; i++) {`
1. `a[i] = function () {`
1. `console.log(i);`
1. `};`
1. `}`
1. `a[6](); // 10`
let
1. `var a = [];`
1. `for (let i = 0; i < 10; i++) {`
1. `a[i] = function () {`
1. `console.log(i);`
1. `};`
1. `}`
1. `a[6](); // 6`
学这个的时候我不明白,为什么a[6]()有时候会是10,有时候会是6。
现在我来粗浅的解释一下(刚学的,欢迎批评指正):
- 首先,js是顺序执行代码的(从上到下,从左到右)。
- 也就是说,在调用函数之前,循环就已经执行完了。
- 这时,
a[i]=function(){console.log(i)},在var声明变量里,i=10,因此会打印10。在let声明变量里,i不会跃出代码块,所以i=a[6]中的6,因此会打印6。
我也看到一种解释是,let声明变量时,
a[6]()更像是去挑选i=6时打印的结果,但我其实不太懂。因为这样的话,那就说明有一排a[i]=function(){console.log(i)},那var里面为什么又等于10,我就又弄不懂了。