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