var、let、const 在作用域、变量提升和暂时性死区上的核心区别是什么
免费版来源:tencent初级工程师变量声明与作用域
草稿
答案解析
这三个主要区别可以从作用域、变量提升和暂时性死区来看。
var 是函数作用域,或者全局作用域,不具备块级作用域。比如在 if、for 代码块里用 var 声明变量,块外面仍然可以访问。let 和 const 是块级作用域,只在当前 {} 内有效。
变量提升方面,var 会发生变量提升,并且会被初始化为 undefined,所以在声明之前访问不会报错,只是值是 undefined:
let 和 const 也存在提升,但不会被初始化。在声明语句执行之前访问,会报错,这段区域就叫暂时性死区,也就是 TDZ:
const 和 let 的作用域、提升、暂时性死区规则基本一致,区别在于 const 声明时必须初始化,而且不能重新赋值:
不过需要注意,const 限制的是变量绑定不能变,不是值本身完全不可变。如果声明的是对象,对象属性还是可以修改的:
总结一下:var 是函数作用域,会提升并初始化为 undefined,没有暂时性死区;let 和 const 是块级作用域,会提升但不初始化,所以有暂时性死区;const 额外要求声明时初始化,并且不能重新赋值。实际开发中一般优先使用 const,需要重新赋值时用 let,尽量避免使用 var。
