let是es6中用来声名变量的,const是es6中用来声名常量(常变量)的。
let:相比于var,let不存在变量提升,且具有块级作用域({}内有效),存在暂时性死区(先赋值,再声明,报错)
const:相比于var,具有块级作用域({}内有效),且声明时必须赋值,后续不可修改。
一.块级作用域:
// let const 具有块级作用域
if (true) {
let a = 1;
var b = 2;
const c = 3;
}
console.log(b)// 2
console.log(c)// c is not defined
console.log(a)// a is not defined
二.暂时性死区
/*使用let声明的变量存在暂时性死区*/
var temp = 123;
var abc = 'abc';
if (true) {
let abc = 'ABC';
temp = 'abc';
let temp;
console.log(abc) //ABC
console.log(temp) //报错,因为存在暂时性死区。因为temp是先赋值再用let声明
}
console.log(abc) //abc
三.没有变量提升
/* 使用let声明的变量没有变量提升 */
console.log(c) //undefined
console.log(d) //Cannot access 'd' before initialization
var c = 10;
let d = 20;
四.const声明时必须赋值
如下所示,a是先赋值变量b,然后再通过var声明b并赋值5,c是在b声明后赋值b变量的。
因为var声明的b会有变量提升。
所以先是var b
然后按照顺序执行
const a = b
b = 5
const c = b
所以a是undefined,b是5。
// const声明时必须赋值
const a = b;
var b = 5;
const c = b;
console.log(a)//undefined
console.log(c)//5