计算机有一套设计良好的规则来存储变量,并且之后可以很方便的找到这些变量。这套规则就被称为作用域。

一、编译原理

尽管js通常归类为“动态”或“解释执行”语言,但其实它是一门编译语言。
传编编译语言的流程
比起那些编译过程只有三个步骤的语言的编译器,JavaScript引擎要复杂得多。例如,在语法分析和代码生成阶段有特定的步骤来对运行性能进行优化,包括对冗余元素进行优化等。

二、理解作用域

几个小伙伴

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

从var a = 1; 这块程序开始,看看三个小伙伴怎么分工的
引擎认为
这里有两个完全不同的声明,一个由编译器在编译时处理,另一个则由引擎在运行时处理。
变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。
编译器有话说:
引擎会为变量a进行LHS查询。另外一个查找的类型叫作RHS。

说一下LHS和RHS
RHS查询与简单的查找某个变量的值别无二致,二LHS查询则是试图找到变量的容器本身,从而可以对其赋值。
例如:console.log(a);
其中对a的引用就是RHS引用,因为这里a并没有赋予任何值。相应的,需要查找并取得a的值,这样才能将值传递给console.log。
总结:赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作的目标是谁(LHS)”以及“谁是赋值操作的源头(RHS)”。
**

三、作用域嵌套

四、异常