程序进行处理的参与者
1 引擎
从头到尾负责整个JavaScript程序的编译及执行过程
2 编译器
引擎的处理过程中的帮手之一,负责语法分析及代码生成(解析(parse)->transform(转换)->generate(生成))
3. 作用域
引擎的处理过程中的帮手之一,负责收集并维护由所有声明的标识符(变量)组成的一些列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
标签:变量,1.2,作用域,javascript,编译器,引擎,声明,赋值 From: https://www.cnblogs.com/czh0316/p/16979790.html编译器首先会将这段程序分解成词法单元,然后将词法单元解析成一个树结构。但是当编译器开始进行代码生成时,它对这段程序的处理方式会和预期的有所不同。
1 遇到var a,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中。如果是,编译器会忽略该声明,继续进行编译;否则它会要求作用域在当前作用域的集合中声明一个新的变量(强引用与弱引用)
2 接下来编译器会为引擎生成运行时所需要的代码,这些代码被用来处理a=2这个赋值操作、引擎运行时会首先询问作用域,在当前的作用域集合中是否存在一个叫做a的变量。如果是,引擎就会使用这个变量;如果否,引擎会继续查找该变量
如果引擎最终找到了a变量,就会将2赋值给它。否则引擎就会举手示意并抛出一个异常!
总结:变量的赋值操作会执行两个动作,实现编译会在当前作用域声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。