ES6,声明的方式有 var 、 let 、 const 、 function 、 class ,本文主要讨论 var 、let 、const。
1.var是函数作用域,let、const是块状作用域
2.用var声明的变量会被提升,而用let、const声明的变量不会被提升
变量提升:也就是将变量声明提升到它所在作用域的最开始的部分。
比如:
console.log(a); //undefined
var a = 10;
如果在声明这个变量之前去引用这个变量,这个变量是用var进行声明的,那么得到的结果其实是undefined,也就是未定义,但是这个变量是存在的。
js在运行之前有一个解析的过程,所以上面代码在js去进行解析的时候,变成了这样:
var a;
console.log(a);//undefined
a = 10;
可以看到变量a的声明在console.log的前面,赋值还是在console.log之后进行赋值的,console.log得到的结果就是undefined.
在声明之前去引用let声明的变量会直接报错,会直接阻断程序的运行。
3.用var可以重复声明同一个变量,而let不可以重复声明,const 变量不能修改。
4.var声明的变量会挂载在window上,而let、const声明的变量不会
let声明的变量的特点
- let 声明的变量具有块作用域的特征。
- 在同一个块级作用域,不能重复声明变量。
- let 声明的变量不存在变量提升,换一种说法,就是 let 声明存在暂时性死区(TDZ)
如下:
let a = 1;
console.log(a); //1
console.log(b); // b is not defined
let b = 2;
const 声明方式,除了具有 let 的上述特点外,其还具备一个特点。
const 定义的变量,一旦定义后,就不能修改,即 const 声明的为常量。