作用域是什么

67 阅读2分钟

作用域就是用来收集并维护变量的一套规则,可以创建变量给变量赋值并且可以访问变量.

编译原理

js是一门编译语言,跟传统编译语言非常相似,但是js引擎又要复杂很多,传统编译过程:

  1. 分词/词法分析:将一段字符串分解成词法单元,词法分析主要判断这个词法单元是单独的还是属于其他词法单元一部分.例如 var a = 2; 被分解为 var, a, =, 2, ;.
  2. 解析/语法分析:将词法单元流(数组)分解成抽象语法树,如: var父节点 a 和 = 是var 的子节点,2 是= 的子节点.
  3. 代码生成:将抽象语法树(AST)转换成可以执行的代码,这个过程跟语言,目标,平台息息相关.

比起传统编译器js引擎要复杂很多,例如在语法分析和代码生成方面要进行很多优化,包括多冗余元素进行优化等.js引擎没有大量时间优化,js引擎是边编译边执行代码的,中间可能就差几微秒.

理解作用域

1.js引擎:负责整个过程编译和执行代码过程.
2.编译器:引擎的好朋友之一,负责语法分析和生成代码.
3.作用域:引擎的另外一个好朋友,负责收集并维护所有声明的标识符(变量)组成的一系列查询,实施一套很严格的规则,确定当前执行的代码对这些标识符的访问权限.
4.LHS左查询:就是引擎问作用域是否存在改变量的过程.赋值目标是谁
5.RHS有查询:就是引擎赋值操作,赋值操作的源头.

var a = 2;执行过程:
1.遇到var a,编译器会问作用域是否存在一个该名称变量,存在就忽略,不存在就创建一个新的变量,命名为a.
2.编译器为引擎生运行代码,这些代码被用来处理a = 2赋值操作.
3.引擎会先问作用域,是否存在a变量这个过程称为LHS(左查询),如果有就使用变量给他赋值这个过程称为RHS(右查询),如果没有就继续找,知道全局作用域,是在没有就会报未声明错误.