var/let/const

var/let/const区分

作用域

var 和 let 的作用域规则一样

1
函数外,是全局执行上下文,函数里,是当前函数执行上下文。//声明的变量的作用域只能是全局或者整个函数块的。
重复声明

var 允许,let/const不允许

1
2
3
4
5
function test() {
var a = 3;
var a = 4;
console.log(a) // 4
}

let是块级作用域

const只能在声明它们的块级作用域中访问

const/let在块级作用域外无法访问内部变量!

1
2
3
4
if(true){
const a=1;
}
console.log(a)
绑定全局变量

在全局环境声明变量,var会在全局对象里新建一个属性,let/const不会

1
2
3
4
5
var foo = 'global'
let bar = 'global'

console.log(this.foo) // global
console.log(this.bar) // undefined

此时let定义的变量实际在test 函数的作用域链上

image-20241104212220166.png

变量提升与暂存死区

image-20241104223204685.png

上述代码的例子中

1
var例子就是变量提升,const/let的报错就是暂时性死区

代码的执行原理

1
创建->初始化->赋值
1
2
var 声明的变量在执行上下文创建阶段就会被「创建」和「初始化」,因此对于执行阶段来说,可以在声明之前使用。
let 声明的变量在执行上下文创建阶段只会被「创建」而不会被「初始化」,因此对于执行阶段来说,如果在其定义执行前使用,相当于使用了未被初始化的变量,会报错。

let 与 const 异同

1
2
唯一区别就在于 const 声明的是一个只读变量,声明之后不允许改变其值。
因此,const 一旦声明必须初始化,否则会报错。