Refer:

https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting
https://www.zhihu.com/question/19636194
https://developer.mozilla.org/zh-CN/docs/Glossary/Hoisting

感谢大牛们对知识的慷慨。参考了上面的三份文档,写一下自己对变量提升的总结。

what:Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。
how:变量和函数声明被从它们在代码流中出现的位置“移动”到代码的顶端。

不同的情况下***声明***的含义存在差别。

总结:

  1. 变量必须有创建并且初始化才能正常使用。
    MDN 上的 “变量可以在声明之前进行初始化和使用” 这句话适用于var,不适用与let
    var 变量提升了num的创建和初始化, 把num初始化为undefined
    let 变量提升了num的创建,但是没有提升初始化,所以抛出异常
    clipboard.png
  2. 提升是以作用域为单位的
    clipboard.png
  3. var 提升
    clipboard.png
  4. let 提升
    clipboard.png
  5. const 提升
    clipboard.png
  6. 函数提升:函数声明会被提升,但是函数表达式不会
    函数声明
    clipboard.png
    函数表达式
    clipboard.png

    命名的函数表达式,函数标识符在外围作用域中也是不可用的
    clipboard.png

  7. 函数优先
    函数会首先被提升,然后才是变量
    clipboard.png
    后续的函数声明确实会覆盖前一个函数声明
    clipboard.png
  8. 把变量提升拆分三个部分:创建,初始化,赋值。对比如下:
    clipboard.png

如理解有误:请帮忙指出,万分感谢!!!


ocean
4 声望1 粉丝