-
编译器处理方式:动作一——声明变量
-
询问作用域是否有a变量
-
有 =》编译
-
如何编译???
- 1、词法分析:词法单元
- 2、语法分析:此法单元流数组==》AST
- 3、代码生成:AST =》代码
-
- 没有 =》 声明a(var a)
-
-
-
引擎运行时的处理方式::动作二——查找变量
-
询问当前作用域是否存在a变量
- 存在 =》 使用a
-
不存在 =》 向上级作用域询问
- 上层存在 =》 使用a
-
上层不存在 =》询问全局作用域
-
全局存在 =》 使用 =》查找停止!!
-
引擎如何查找变量???
- LHS:变量在赋值操作的左侧
- RHS:变量在在赋值操作的非左侧(注意:return a + b是两次RHS)
-
-
全局不存在 =》 抛出异常=》查找停止!!
-
错误类型有哪些???
-
referenceError
- RHS查找变量不存在
- LHS在严格模式下查询失败(补充:非严格模式下会创建一个变量给引擎)
-
TypeError
-
不合理的操作
- 调用非函数类型
- null/undefined
-
-
-
-
-