20200214
- date: 20200214
- author: czhang
Plan
你不知道的 JavaScript 第一部分
Notes
编译原理(Compiling Code)
1. 词法分析(Tokenizing/Lexing)将字符串分解成词法单元(token)
2. 生成AST树
3. AST 树 生成代码(Code Generation) => 生成机器指令
作用域
三个角色:
1. 编译器 (生成AST树 & 生成代码 )
2. 引擎 (编译 & 执行过程) => 进行(LHS 和 RHS 查询)
3. 作用域 (收集 & 维护所有声明标识符)
LHS/RHS
LHS:如 a = 2 为 “= 2” 找到一个目标, 对 a 的 LHS引用
RHS:得到它的源头值 如 console.log(a) 对 a 对引用
注意:
1. 对 自己定义函数的寻找 为 RHS引用 找到 对应的函数类型的值
2. 函数调用 为对 函数参数对 RHS 引用 隐形赋值
这里对例子理解了很久 对 LHS 和 RHS 的判断 容易出错, 需要反复理解
作用域嵌套 (get)
异常
1. RHS 查询出错 , 引擎会抛出 ReferenceError
2. LHS 如果在 全局作用域还无法找到,全局作用域会自己创建一个具有该名称的变量
3. “严格模式”下,LHS 查询失败也会抛出 ReferenceError
4. 如果 RHS 查找到对应变量,但给其赋值为不合理的操作,会抛出 TypeError
词法作用域
1. 作用域有两种工作模型: 词法作用域 & 动态作用域
2. 写代码的时候将变量和块作用域写在哪里来决定的作用域 为 词法作用域
欺骗词法
1. eval()
eval 的参数 是以代码形式动态插进来的,对当前词法作用域环境进行修改。
More
- 重点 LHS RHS 辨别区分