你不知道的js上篇
-
作用域是什么
- 编译三步走
- 分词/词法分析
- 解析/语法分析,将词法转换成程序语法树(抽象语法树,Abstract Syntax Tree,AST)
- 代码生成,将AST转为可执行代码
- 作用域参与者
- 引擎,从头到尾js的编译和执行
- 编译器,上面的编译三步走
- 作用域,实施一套严格的规则,确定当前执行代码的标识符访问权限
- 重要的引擎查询LHS和RHS(赋值操作的左侧或右侧)
- LHS,赋值操作的目标是谁(查找的目的是为变量进行赋值)
- RHS,谁是赋值操作的源头(目的是获取变量的值)
- LHS和RHS区别
- RHS找不到顶层会抛出ReferenceError,LHS找不到顶层(在非严格模式下)会创建一个全局变量
- RHS查询变量,值进行不合理的操作,抛出TypeError
- ReferenceError同作用域判别失败相关,TypeError作用域判别成功,但结果的操作是非法或不合理的
- 编译三步走
-
词法作用域
- 词法作用域是由你在写的代码时将变量和块作用域写在哪里来决定的
- 欺骗词法(不要使用他们)
- eval,对一段代码或多个声明字符串进行演算,修改已存在的词法作用域
- with,通过将一个对象的引用当作作用域来处理,将对象的属性当作作用域中的标识符来处理,从而创建了一个新的词法作用域
- 欺骗词法,让引擎无法在编译时对作用域查找进行优化