1. 定义变量
举例:
var a = 2;
解释:
- 三个主人翁:
- 引擎:从头到尾负责整个JavaScript程序的编译和执行过程。
- 编译器:引擎的搭档,负责语法分析及代码生成等脏活累活。
- 作用域:引擎另一个搭档,负责收集并维护有所有声明的标识符(变量)组成的一系列查询,并有一套严格的规则,能决定当前执行的代码对这些标识符的访问权限。
- 两步操作:
- 编译器定义一个内存,命名为a
- 引擎把2赋值给内存a
LHS查询和RHS查询
var a = 2;
var b= 1 + a;
- LHS查询:查询到一个变量,对其进行赋值的过程 (如:a=2的过程)
- RHS查询:查询到一个变量,并用其值的过程 (如:b= 1 + a 用到了a的值)
作用域
var a = 1;
function foo(){
var b = 2
var c = a + b
}
foo()
解释:
- 引擎:局部作用域,老弟,我要进行a+b,你有a和b吗?
- 局部作用域:引擎大哥,我有b,但是没找到a。
- 引擎:好的,那我去问我全局作用域大哥。
- 引擎:全局作用域大哥,你有a吗?
- 全局作用域:引擎老弟,我刚好有a,给你。
- 引擎:局部作用域老弟,你有c吗?
- 局部作用域:引擎大哥,我刚好有c,给你。
总结
作用域就是一个变量所覆盖的范围,当引擎用到变量时,会向作用域寻找变量,如果找到变量,就可以拿过使用。如果没有找到,便会向上一级继续寻找,知道找到为止。在最外部(全局作用域)也没有找,则会抛出referenceerror错误(在ES5引入“严格模式”之前,会新声明一个内存区间并命名)。LHS和RHS是一个小知识点,有兴趣的大家可以了解一下。