一、var声明变量的特点
(1)变量提升:使用var声明变量会自动提升到函数作用域的顶部。
(2)var声明的范围是函数作用域
(3)var在全局作用域中声明的变量会成为window对象的属性
二、let声明变量的特点
(1)let声明的范围是块级作用域。
(2)暂时性死区,let声明的变量不会在作用域中被提升。
let声明之前的执行瞬间被称为“暂时性死区”,在此阶段引用任何后面才声明的变量都会抛出ReferenceError。
(3)let在全局作用域中声明的变量不会成为window对象的属性。
三、const声明变量的特点
(1)const的行为与let基本相同,唯一重要的区别是const声明变量时必须同时初始化变量,且尝试修改const声明变量会导致运行时错误。
(Assignment to constant variable)意思是常数变量赋值
注意:const声明的限制只适用于它指向的变量的引用,即如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。
四、区别
(1).变量提升
- var声明的变量存在变量提升,即变量可以在声明前调用,值为undefined
- let和const不存在变量提升,即他们所声明的变量一定要在声明后使用,否则报错。
(2).暂时性死区
- var不存在暂时性死区
- let和const不存在变量提升,即它们所声明的变量一定要在声明后使用,否则报错
(3).块级作用域
- var不存在块级作用域
- let和const存在块级作用域
(4).重复声明
- var允许重复声明
- let和const在同一作用域不允许重复声明变量
(5).修改声明的变量
- var和let可以
- const声明一个只读的常量。一旦声明,常量的值就不能被改。
五、使用
- 能用const的时候尽量使用const,其他情况下大多数使用let,尽量避免使用var。