要想了解JavaScript的工作机理,我推荐一本js的书:《你不知道的JavaScript》的上卷,里面介绍了学习js的一些难点和js的工作机理。
接下来是我的对JavaScript的工作机理中的运行机制的理解:
同时由一个例子来解释:var a=2的工作机制;
在此过程中需要三个事务来运行js的工作原理:引擎,编译器,作用域。
1:当开始遇到var a时,编译器首先先询问是否存在一个同名的变量存在于同一个作用域的集合里,如果木有,就会要求编译器在此作用域的集合里新建一个名为a的变量;否则编译器会忽略该声明,继续编译;
2:接下来编译器会为引擎生成运行时所需的代码,这些代码被用于处理a=2这个赋值操作,引擎运行时会询问作用域,在当前的作用域的集合里是否存在一个名为a的变量,如果有,引擎就会使用该变量,否则引擎就会继续寻找该变量。
3:找到a变量时,引擎就会将值2赋值给变量。
在引擎查找a变量时,可有两种查询的方式:LHS查询和RHS查询
如果查找的目的是对变量赋值,那就是LHS查询;如果查找的目的是获取变量的值,那就是RHS查询。
例子:
console.log(a);
其中对a的引用是一个RHS引用,因为这里a并没有赋值任何值。相应地,需要去查找并取得a的值,在将值传递给 console.log().
a=2;
这里对a的引用是一个LHS引用,因为实际上我们不关心当前的值是什么,只是要为=2这个赋值操作找到一个目标来执行赋值操作。
注意:编译器可以在代码生成的同时处理声明和值的定义。
最后来句总结性的话语:变量的赋值操作会执行两个操作,首先编译器会在当前的作用域中声明一个变量(如果变量之前木有声明过),然后在运行时引擎就会在作用域里查找该变量,如果找到就会执行赋值操作。