初学JavaScript,浅谈变量提升
ES6之前我们一般使用var来声明变量,提升简单来说就是把我们所写的类似于var a = 123;这样的代码,声明提升到它所在作用域的顶端去执行,到我们代码所在的位置来赋值。
学习更多,请点击:https://www.bilibili.com/video/BV1g84y1F7vS
https://www.bilibili.com/video/BV1a54y1b7hh
https://www.bilibili.com/video/BV17h411U7L7
https://www.bilibili.com/video/BV1wB4y1A7d2
https://www.bilibili.com/video/BV1m64y1S7Rx

学习更多,请点击:https://www.bilibili.com/video/BV1g84y1F7vS
https://www.bilibili.com/video/BV1a54y1b7hh
https://www.bilibili.com/video/BV17h411U7L7
https://www.bilibili.com/video/BV1wB4y1A7d2
https://www.bilibili.com/video/BV1m64y1S7Rx

2、函数提升
javascript中不仅仅是变量声明有提升的现象,函数的声明也是一样;具名函数的声明有两种方式:
学习更多,请点击:https://www.bilibili.com/video/BV1g84y1F7vS
https://www.bilibili.com/video/BV1a54y1b7hh
https://www.bilibili.com/video/BV17h411U7L7
https://www.bilibili.com/video/BV1wB4y1A7d2
https://www.bilibili.com/video/BV1m64y1S7Rx

函数字面量式的声明与变量提升的结果是一样的,函数只是一个具体的值; 但是函数声明式的提升现象和变量提升现象又不尽相同
先来个例子
学习更多,请点击:https://www.bilibili.com/video/BV1g84y1F7vS
https://www.bilibili.com/video/BV1a54y1b7hh
https://www.bilibili.com/video/BV17h411U7L7
https://www.bilibili.com/video/BV1wB4y1A7d2
https://www.bilibili.com/video/BV1m64y1S7Rx

编译阶段:(由编译器执行)
变量和函数声明提升到全局执行上下文的最顶端:scope对象里面的数据:(小结会解释什么是scope对象)

执行阶段:(由引擎执行,我是这么理解的)
第一个shoWName()执行时:此时引擎会询问编译器是否见过shoWName()函数,由于此时第2行代码中的shoWName还没有值(undifined),所以编译器会返回5行代码所声明的函数,并输出 1 (函数优先)
第二个shoWName()执行时scope变量发生改变{shoWName:function () {console.log(2)}},因为按照代码从上到下的执行顺序,会对变量showName赋值(第二个showName()出现在赋值代码后面),接收一个函数表达式,并且把之前声明的同名函数表达式覆盖
此时调用shoWName()会执行覆盖后的通过函数字面量声明的shoWName()函数执行console.log(2)这句代码,输出 2。
小结:
只有声明本身会被提升,而赋值操作不会被提升。
函数声明会被提升,但函数表达式不会被提升。
scope 对象,存放当前代码执行上下文中的所有变量的引用
代码一定是逐行运行的
分为编译阶段和执行阶段
变量提升后,会给变量设置默认值undefined
学习更多,请点击:https://www.bilibili.com/video/BV1g84y1F7vS
https://www.bilibili.com/video/BV1a54y1b7hh
https://www.bilibili.com/video/BV17h411U7L7
https://www.bilibili.com/video/BV1wB4y1A7d2
https://www.bilibili.com/video/BV1m64y1S7Rx
作者:东理_子龙
链接:https://juejin.cn/post/6951244051534659597
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。