在 ES6+ 之前变量的声明使用的是 var 关键字,但对于用 var 声明的变量,不管声明位置在哪里都会被提升到当前作用域的顶端,也成为变量提升。
如果是在函数体内声明的话就会提升到函数的最前面,如果是在全局作用域下就会提升到全局的最前面。
为什么只会输出 undefined ?因为 var 只会做声明的提升,具体的赋值还是会等到执行到那一行才会执行。
而在 ES6+ 之后,为了解决变量提升这个问题,也称为暂时性死区,新增了 let 和 const 声明变量的关键字。
暂时性死区:在代码块内,使用 let 声明变量之前,该变量都是不可用的。
const 也不允许在声明之前使用变量, const 是用于声明作用域的局部常量,常量的值不能通过 赋值运算符(=) 重新赋值改变,但如果常量是一个对象的话,它的属性可以被添加、更新或删除。
关于为什么常量是对象的话就可以修改属性呢?
因为在对象(引用数据类型)中,使用 const 声明一个对象时声明的是一个对象的内存地址引用,不能通过赋值运算符重新赋值也就是不能改变这个引用去指向另一个对象。