var 和let的区别

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);//这里之所以 不为0;是因为我们只是定义了该函数,未被调用,所以没有进入该函数执行环境,当然不会沿着作用域向上搜索找到值;

}

var i=1;//第二次循环,这时var i=1;覆盖了前面的var i=0,即现在的 为 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;

var 和let的区别_第1张图片
var 和let的区别_第2张图片

你可能感兴趣的