关于var a = 1 这件事发生了什么?

42 阅读1分钟
  • 编译器处理方式:动作一——声明变量

    • 询问作用域是否有a变量

      • 有 =》编译

        • 如何编译???

          • 1、词法分析:词法单元
          • 2、语法分析:此法单元流数组==》AST
          • 3、代码生成:AST =》代码
      • 没有 =》 声明a(var a)
  • 引擎运行时的处理方式::动作二——查找变量

    • 询问当前作用域是否存在a变量

      • 存在 =》 使用a
      • 不存在 =》 向上级作用域询问

        • 上层存在 =》 使用a
        • 上层不存在 =》询问全局作用域

          • 全局存在 =》 使用 =》查找停止!!

            • 引擎如何查找变量???

              • LHS:变量在赋值操作的左侧
              • RHS:变量在在赋值操作的非左侧(注意:return a + b是两次RHS)
          • 全局不存在 =》 抛出异常=》查找停止!!

            • 错误类型有哪些???

              • referenceError

                • RHS查找变量不存在
                • LHS在严格模式下查询失败(补充:非严格模式下会创建一个变量给引擎)
              • TypeError

                • 不合理的操作

                  • 调用非函数类型
                  • null/undefined

第一章 作用域的前世今生.png