说到作用域首先需要提到到是 “变量” ,变量在编程中代表着一个数
据的值,变量的状态会被改变,读取和写入。但是变量,或者说一些被
存储的数据如果没有合理的划分管理,那对于编程者和计算机的编译都
带来很大的不便利,所以为了更加规范更加高效,每个数据都需要有它固
定的活动区域也就是作用域。
想要了解作用域不能操之过急,需要先从基础入手,要了解作用域在整
个编程和解析过程中起的作用需要先了解JS的一些编译原理。JS是一
门编译语言,但是它不是预编译的。首先,什么是编译语言,单从当前
语言来解释可以概括为源码在实际执行之前会被预先处理翻译成适合当
前运行环境的状态。
1.JS的编译大致分为三个状态:
词法分析;语法分析;生成代码;这里不做过多解释。前面说过JS并
不是预编译语言,它是在代码执行前实时编译。
2.在这之后我们需要知道是谁负责这些处理工序。
引擎:负责控制整个编译和执行过程。
编译器:负责语法分析和代码生成。
作用域:负责收集并维护所有声明的变量,组成一些列的查询(后边
说到),这些变量都有他们的访问权限。
举个栗子?:作用域就像辖区的警察,而存储的变量就是管辖的居
民,这些居民的调度当然由他负责。
3.编译过程中的查询
再举一个栗子?:var a = 2;当这个变量声明时看看编译器是怎么
处理的。
首先:编辑器会查询在当前作用域中有没有已经声明的同名变量,如果
存在的话会忽略这个声明,继续执行赋值操作,如果不存在的话会声明
一个新的变量为它开辟内存。
接下来会执行赋值操作,如果在当前作用域找到引擎会给这个变量赋值
如果当前作用域没有,会一直向上,直到全局作用域,找到会进行赋值
操作,找不到会抛出错误。
4.LHS和RHS
在上边说到作用域会对变量组成一系列的查询,这里的查询也做出了划
分。
LHS左查询:var a = 2;这就是一个左查询,变量出现在赋值操作左
侧。当变量出现在赋值操作左侧,也就是像上面说的一样,左查询试图
找到容器本身,对他赋值。
RHS:console.log(a);这就是一个右查询,右查询实际上是,当一
个变量的值在某个地方需要被获取时,只是单纯的去查找而不是像左
查询需要必须找到去进行赋值,不存在还要去帮忙创建。
最后一个栗子?:var b = a; b= 是左查询因为这里我们声明了
b并且想要给他赋值,那我么就需要查询一下b是否存在当前作用域,
不存在的话帮忙创建一个才能有地方存放要被给予的值。后半段的a
是右查询,这里我们只是想要获取到a的值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。