01.作用域

96 阅读2分钟

编译及其过程

编译:程序在执行一段源代码之前的三个步骤:分词、解析、代码生成。

  • 分词: 就是将字符组成的字符串分成有意义的代码块,比如:var a = 2;可以被分解成var、a、 = 、2;
  • 解析: 就是将词法单元生成抽象语法树。(AST)
  • 代码生成,将抽象语法树转换成可执行的代码

基本概念

  1. 引擎
  • 从头到尾负责整个 JavaScript 程序的编译及执行过程
  1. 编译器
  • 引擎的好朋友之一,负责语法分析及代码生成等脏活累活
  1. 作用域
  • 收集并维护由所有声明的标识符(变量)组成的一系列查 询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

例如:下面这个例子可以说明js执行代码的过程:

  • 首先,var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
  • 接下来,a = 2 会查询(LHS 查询)变量 a 并对其进行赋值。
  1. LHS查询:
  • 如果目的是对变量进行赋值,那么就会使用 LHS 查询
  1. RHS查询
  • 如果目的是获取变量的值,就会使用 RHS 查询
  1. 作用域
  • 一套规则,用于确定在何处以及如何查找变量(标识符)。 例如:下面这个例子可以用来说明LHS和RHS查询

LHS 查询: c = foo(2); foo函数的形参a接收到实参2; foo函数内部将a赋值给b;

RHS 查询: 找到foo()这个函数的引用 找到a变量的值 在foo函数内部引用变量a 在foo函数内部引用变量b

function foo(a) { 
  var b = a;
  return a + b;
} 
var c = foo( 2 );