三个关键字:var、let、const
Tipes: var在所有ECMAScript版本都能使用,let、const只能在ECMAScript6和以后的版本使用。
提问环节:
❓❓❓三个关键字有啥区别
var声明的范围是函数作用域,let、const声明的是块级作用域。
var声明变量会提升到函数作用域顶部,let、const因为暂时性死区所以不会发生变量提升。
var可以重复声明覆盖自己声明过的变量但是不能重复声明覆盖let、const声明的变量,let、const不连自己声明过的变量都不能重复声明覆盖。
var、let声明的时候可以不赋初始值并且可以随时修改,const声明的时候必须初始化,而且不能修改。(引用数据类型不能修改指针,可以修改内容)
全局声明的时候,var声明变量挂在在window对象,let、const因为ES6中,全局对象的属性和全局变量脱钩,所以没有在window上在对应的块级作用域的活动对象上。
let、const相比var,在块级作用域比函数作用域更早终止的情况下有助于垃圾回收提升性能。
❓❓❓什么是块级作用域?
对应的还有全局作用域,函数作用域。块级作用域由ES6新增,一对{}包裹的就是块级作用域,块级作用域要配合let、const使用,对于var来说是没有块级作用域的。
❓❓❓为什么要引入块级作用域?
为了解决var声明变量具有变量提升特性的缺陷。
❓❓❓变量提升是怎么造成的?
因为JS引擎并非一行一行地分析和执行程序,而是一段一段地分析执行。当执行一段代码的时候,会进行一个“准备工作”,js在执行上下文的时候,会进行两个阶段:1.分析 2.执行,进入执行上下文时,首先会处理函数声明,其次会处理变量声明,在分析的过程中变量已经被声明挂在了变量对象上面,只不过没有具体赋值,所以这些变量和函数能在它们真正被声明之前使用。
❓❓❓怎么解决变量提升?
使用let、const代替var声明变量,在块级作用域里面let、const 声明之前都被称为暂时性死区,这个区域里面引用后面才声明的变量都会报错。❗️暂时性死区会导致之前百分百安全的typeof不再安全。