一、人物关系
1、引擎
从头到尾负责整个JavaScript程序的编译及执行过程。
2、编译器
引擎的好朋友,负责语法分析及代码生成等脏活累活。
3、作用域
引擎的另一位朋友,负责收集并维护所有生命的标识符组成的一系列查询,并实施一套非常严格的查询,确定当前执行的代码对这些标识符的访问权限。
二、对话
当我们看到var a = 2;
的时候,就会觉得这是一个声明而已。
但我们的朋友们却不这么认为,引擎认为这里有两个声明,一个是编译器编译的时候处理的,一个是引擎运行处理的。
三、分工合作
1、编译器遇到
var a
,编译器会询问作用域是否有一个该名称的变量存在同一个作用域。如果是,编译器就会忽略该声明,继续进行编译;否则它会要求作用域在当前域声明一个新的变量,并命名为a
;
2、接下来编译器会为引擎生成运行时所需要的代码,这些代码被用来处理
a = 2
这个赋值操作。引擎运行时首先会询问作用域,当前作用域是否存在a
变量,如果是,引擎就会使用这个变量。如果否,引擎就会继续查找该变量(通过作用域链)。
如果最终引擎找到了变量,就会将2赋值给他。否则引擎就会抛出一个异常,你这个找不到的啦!
本文是《你不知道的JavaScript》的学习笔记,文中举例非本人原创。