一、先来谈一下js预解析
1.我们 js 引擎运行 js 分为两步:预解析和代码执行。
预解析 :js 引擎会把 js 里面所有的 var 还有 function 提升到当前作用域的最前面
代码执行:按照代码书写的顺序从上往下执行。
2.预解析分为变量预解析(变量提升)和函数预解析(函数提升)。
(1)变量提升就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作。
(2)函数提升就是把所有的函数声明提升到当前作用于的最前面。
二、我们来看一下js中变量的声明方式
1、var特点:
3、全局变量 有变量提升 函数级作用域
2、let const 特点:
不属于顶层对象window
不允许重复声明
不存在变量提升
暂时性死区:
(在let的作⽤域⾥⾯,只要和⽤let定义的变量同名的,都不起作⽤,哪怕是全局的,哪是在这个变量的前⾯定义 ,前⾯⽤的也不⾏)
块级作用域:作⽤域外⾯不好使,块级作⽤域就是⼀个{}就是⼀个作⽤域 ,for{}也是⼀个块作⽤域.
3、let和const的不同点:
let声明的变量可以改变,值和类型都可以改变;const声明的常量不可以改变,这意味着,const一旦声明,就必须立即初始化,不能以后再赋值。
三、变量提升和函数提升
1、var 的变量提升
这就是发生了变量的提升,我们变量提升只是提升了变量的声明而没有提升变量的赋值
2、let和const的提升
这个就是暂时性死区的问题,出现这种情况的原因是let和const的变量虽然也发生了提升,但是js引擎并不会给他初始化,此时在变量声明语句之前去访问会报错ReferenceError
3、函数提升(函数提升比变量提升更优先)
四、相关练习题