作用域是什么
作用域是一套规则,用来存储和访问变量。
任何编程语言都离不开作用域,正是作用域这种存储和访问变量的能力将状态带给了程序,赋予了编程语言可以实现丰富功能的能力
讲到作用域不得不提两个重要的角色:引擎和编译器。
引擎从同到尾负责整个Javascript程序的编译和执行过程。编译器扶着词法分析、语法分析、代码生成等脏活累活。
JavaScript是一门编译型的语言,但是它不会提前编译,它的编译发生在代码执行的前的几微秒
传统的编译分成三个阶段
1. 分词/词法分析 -- 将字符组成的字符串分解成有意义的代码块(词法单元)
例如 `var a = 2; ==> var、a、=、2、;`
2. 解析/语法分析 -- 将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表语法结构的树(抽象语法树)
例如 `var a = 2` var == VariableDeclation 顶级节点; a == Identifier 子节点 以及assignmentExpression的子节点的值NumerLiteral = 2的子节点
3. 代码生成 -- 将AST转换为可执行代码的过程
变量的赋值操作会执行两个动作,1.声明一个变量,2.查找这个变量并给他赋值
这个过程中变量查询主要分为:LHS查询(赋值操作的目标)和RHS查询(赋值操作的源头);
当一块或函数嵌套在另一块或函数中是,就发生了嵌套。
引擎从当前作用域开始查找变量,如果找不到,就向上一级继续查找,知道最外层的全局作用域。
如果全局作用域中也没找到,会根据查询类型不同抛出不同错误。
LHS查询在严格模式下抛出ReferenceError,非严格模式下隐式的创建全局变量;RHS抛出ReferenceError错误。
作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。
如果查找的是对变量进行赋值,那么就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询
你不知道的JavaScript(上)- 作用域和闭包 - 作用域是什么
原文:https://www.cnblogs.com/small-double/p/13940589.html