1. var
-
var 定义的变量可以修改,如果不初始化会输出undefined,不会报错;
-
在相同作用域里,可以重复声明同一个变量;
-
会声明提升;( if 内的 {} 不是作用域)
2. let
-
let是块级作用域,函数内部使用let 定义后,对函数外部无影响;
-
在相同作用域里,不可以重复声明同一个变量;
-
声明的变量不会存在变量提升;( if 内的 {} 是作用域 )
-
“暂时性死区”,在代码块内,使用
let
命令声明变量(或者const
声明常量)之前,该变量(常量)都是不可用的。
底层原理:
1.在底层自动被翻译为匿名函数自调;
2.变量自动改名,比如 let t = XX => var _t = XX
let b = 100
console.log(window)
console.log(b)
// 等价于
(function(){
var _b = 100
console.log(window)
console.log(_b)
})()
3.const
-
const 定义的变量不可修改,而且必须初始化,不能用null 占位;
-
在相同作用域里,不可以重复声明同一个变量;
-
声明的变量不会存在变量提升;
-
声明的是复杂类型数据,可以修改属性;
var a1
console.log(a1) // undefined
console.log()
// 在相同作用域里
{
var b1 = 1
var b1 = 2 // 可以重复声明变量
console.log(b1) // 2
// let b2 = 21
// let b2 = 22 // 报错
// const b3 = 31
// const b3 = 32 // 报错
}
console.log(b1) // 2
// console.log(a2)// “暂时性死区”,在代码块内,使用let命令声明变量(或者const声明常量)之前,
let a2
console.log(a2)// undefined
// console.log(a3)// “暂时性死区”,在代码块内,使用let命令声明变量(或者const声明常量)之前,
const a3 = 31
// const a3
// console.log(a3)// 初始化必须声明,不然会报错