浅谈var、let 和 const 的区别
ES6 中新增let
命令,用来声明变量。它的用法类似于var,但是不存在变量提升,且只在let
命令所在的代码块内有效,
const
是用了声明只读常量的,一旦声明,常量的值就不能修改
下图表明了它们的区别
声明方式 | 变量提升 | 暂时性死区 | 重复声明 | 初始值 | 作用域 |
var |
允许 |
不存在 | 允许 | 不需要 | 非块级 |
let |
不允许 |
存在 | 不允许 | 不需要 | 块级 |
const | 不允许 | 存在 | 不允许 | 需要 | 块级 |
1.变量提升
变量提升,即变量可以在声明之前使用,值为undefined
console.log(a) var a = 1 //undefined let a = 1 //报错,Uncaught ReferenceError: a is not defined const a = 1 //报错,Uncaught ReferenceError: a is not defined
2. 暂时性死区
ES6 中规定,如果代码块内,存在let
或 const
,那么这个代码块内声明的变量,从一开始就会形参封闭区域。凡是在声明之前就使用这些变量,就会报错,在语法上,称为"暂时性死区"
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
3.重复声明
指在相同的作用域内,重复声明同一个变量
var a = 1;var a = 2;console.log(a)//2 let a = 1;let a = 2;console.log(a)//Identifier 'a' has already been declared const a = 1;const a = 2;console.log(a)//Identifier 'a' has already been declared
4.初始值
const
声明的是一个只读的常量,一旦声明,就必须赋初始值,而且声明之后不允许改变
const PI = 3.1415 PI = 3 // 报错,Uncaught TypeError: Assignment to constant variable.
5.作用域
{ var a = 1 let b = 2 const c = 3 } console.log(a) //1 console.log(b) //is not defined console.log(c) //is not defined