20200214

@czhang
  • 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 辨别区分