var 声明的是全局变量,let声明的是块级变量。
下面内容是摘自let闭包理解,觉得讲的很不错;
var a=[];
for(var i=0;i<10;i++){
a[i]=funtcton(){
console.log(i);
}
}
a[6](); //10
解析过程:
var i=0;//由于var声明变量i,所以for循环代码块不具备块级作用域,因为认为是全局变量,直接放在全局变量中。
a[0]=function(){
console.log(i);//这里之所以 i 不为0;是因为我们只是定义了该函数,未被调用,所以没有进入该函数执行环境,i 当然不会沿着作用域向上搜索找到值;
}
var i=1;//第二次循环,这时var i=1;覆盖了前面的var i=0,即现在的 i 为 1
a[1]=function(){ console.log(i) } //解释同a[0]
。。。以此类推
var i=10; //这个时候 i 为10,因为不满足循环条件,跳出循环。
紧接着向下执行,a[6](); //这时调用a[6]函数,随即进入a[6]函数的执行环境,执行代码 a[6]=function(){ console.log(i) },因为执行环境中不存在变量 i ,所以此时会沿着作用域链向上寻找,即进入了全局作用域中寻找变量 i,而全局作用域中的 i =10覆盖了前面所有的值,所以a[6]()输出10;