1
2
3
4
function foo(a){
console.log(a);
}
foo(2);

过程分析:
1.引擎要执行foo()这个函数,所以引擎要从作用域中查找这函数(RHS查询)
2.作用域回复引擎,找到了,是先前编译器声明的,是一个函数
3.引擎就执行了,然后里面有个参数a,引擎又得在作用域里找这赋值2的a(LHS查询)
4.作用域回复这也是编译器声明的,a是foo函数里面的一个参数
5.引擎执行foo函数中的内容了,遇上console,还得在作用域里面找
6.作用域回复这是小事儿,console是内置对象,直接用
7.引擎在console对象里找,找到了log()函数,然后有个a传递进log,还得和作用域确认一下这个a的值(RHS查询)
8.作用域回复这a没变过,放心用
9.引擎完成了整个函数的调用

异常

1
2
3
4
5
function foo(a){
console.log(a+b);
b=a;
}
foo(2);

这儿b没有声明,所以RHS查询不到,于是报错:RerferenceError b is not defined

1
2
var a=0;
a();

此处RHS查询,作用域判别成功了,但是执行了不合理的调用,所以报错TypeError