你不知道的JS声明和赋值

100 阅读2分钟

var a = 2;

最表层的理解, 声明了一个 a 变量 赋值 2;

深层一点的Js,他在中间做的动作;

引擎

引擎负责从头到尾的整个JS程序编译和执行过程。

编译器

负责语法分析和代码生成等。

作用域

收集维护所有的变量,认作,给变量的一个家,一个区域。

var a = 2;

声明的执行过程

1、编译器在编译时,2、引擎在运行时

在 var = a 时,编译器询问作用域,这个a是否存在,如果有,编译器则忽略这个声明,否则会在作用域产生一个新的变量,并命名为a

编译器会生成引擎运行时所需要的代码,在运行的时候引擎在当前作用域查找一个叫做a的变量,如果有就会赋值执行,如果没有,引擎就会继续查找,找不到就会抛出异常。

深入

编译器在第二步‘生成了代码’引擎执行时,会通过查找变量来判断是否已经声明。

引擎对变量的执行查找,称为LHS查找,另一个查找的类型叫做RHS。

赋值操作的 L 左 R 右(实际,称为叫,非左侧)

举例

a = 2;

这是一个LHS引用,因为这个操作的目的,并不是想知道关心当前的值是什么,只是想 为 = 2这个赋值找到一个目标

(赋值操作的目标是谁)

console.log(a)

这是一个RHS引用,因为a并没有赋予任何值。需要查找并获取a的值,才能将值 传送给consolo.log(?);

(谁是赋值操作的源头)

如果查找的目的是对

变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。