区别:
- var声明的变量,其作用域在该语句所在的函数之内,存在着变量提升的现象。
- let声明的变量,其作用域为该句所在的代码块内,不存在变量提升的问题。
- let相比于var,其不允许在相同作用域内,重复声明同一个变量。
{ let a = 11; var b = 51; } a // Uncaught ReferenceError: a is not defined b // 51
上述的代码的结果说明,let所声明的变量只在其代码块中有效。
var a = []; for (var i = 0; i < 4; i++) { a[i] = function () { console.log(i); }; //使用var声明,得到4个4 } a[0](); //4 a[1](); //4 a[2](); //4 a[3](); //4 //使用let声明,得到0,1,2,3 var a = []; for (let i = 0; i < 4; i++) { a[i] = function () { console.log(i); }; } a[0](); //0 a[1](); //1 a[2](); //2 a[3](); //3 //使用let声明,得到0,1,2,3
上述for循环的例子,我们可以这样理解。当for循环使用let时产生了块级作用域,每次循环块级作用域中的 i 都相互独立,并不像var那样全程共用了一个。因此它输出的结果便与var的结果不同。
var boo=521; if(true){ boo='abc';//ReferenceError: boo is not defined let boo; }
上述代码中,存在着全局变量boo,但是块级作用域内let又声明了一个局部变量boo,导致后者绑定这个块级作用域,所以在let声明变量前,对boo赋值会报错。总而言之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。
在这里,再加下const,因为const的行为与let基本相同,唯一一个重要的区别为用于它声明变量时必须初始化变量,且尝试修改const声明的变量会导致运行时错误.const与let一样声明变量也是一个块级作用域变量,const声明的变量也没有"变量提升",必须先声明后使用,且也不可以与前面的let,var,const所声明的变量重复,但是,const声明的变量重定义的对象数组中的属性值是可以修改的,基础数据类型不可以修改而已.