var 全局变量 可以重复赋值 有变量提升
let 只在块级作用域有效 不可重复赋值 无变量提升
const 只在块级作用域有效 只读变量 常量值不能改变
var a = 1
let b = 2
const c = 3
function test() {
a = 11
b = 22
// c = 33 //报错
console.log(a, b, c) //11,22,3 const常量不能二次赋值
}
test()
if (true) {
console.log(aa); //bb报错 cc报错 只有var 存在变量提升
var aa = 11
let bb = 22
const cc = 33
}
console.log(aa); //bb报错 cc报错 let const 只在块级作用域起作用
1.let const var
1.1var声明的变量会挂载在window上,而let和const声明的变量不会
var a = 100;
console.log(a,window.a); // 100 100
let b = 10;
console.log(b,window.b); // 10 undefined
const c = 1;
console.log(c,window.c); // 1 undefined
var a = 100;
console.log(a,window.a); // 100 100
let b = 10;
console.log(b,window.b); // 10 undefined
const c = 1;
console.log(c,window.c); // 1 undefined
2.2var声明变量存在变量提升,let和const不存在变量提升
console.log(a); // undefined ===> a已声明还没赋值,默认得到undefined值
var a = 100;
console.log(b); // 报错:b is not defined ===> 找不到b这个变量
let b = 10;
console.log(c); // 报错:c is not defined ===> 找不到c这个变量
const c = 10;
3.3let和const声明形成块作用域
if(1){
var a = 100;
let b = 10;
}
console.log(a); // 100
console.log(b) // 报错:b is not defined ===> 找不到b这个变量
if(1){
var a = 100;
const c = 1;
}
console.log(a); // 100
console.log(c) // 报错:c is not defined ===> 找不到c这个变量
3.4同一作用域下let和const不能声明同名变量,而var可以
var a = 100;
console.log(a); // 100
var a = 10;
console.log(a); // 10
let a = 100;
let a = 10;
// 控制台报错:Identifier 'a' has already been declared ===> 标识符a已经被声明了。
3.5let和const存在暂存性死区
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}