理解作用域
对于语句 var a = 2;
编译过程分两步:一是完成变量的声明,如果同一作用域下已经有了该声明,编译器会忽略;二是为js引擎的执行生成代码;
编译之后生成了可执行的代码,接下来由引擎来执行;此时引擎会做两件事情,一是LSH查询,二是RSH查询;
"L"和"R"分别指左和右,但是本质上LSH指的是对变量声明的查询或者说为2找了一个容器,而RSH指的是对变量的值的查询;
对于以下语句:
function foo(){
console.log(a);
}
想象引擎和作用域之间的对话,也许是这样的:
引擎:作用域啊,我需要为foo进行RHS查询(因为我要执行foo),你见过它吗?
作用域:见过!编译器那家伙刚刚生命了它。是一个函数,给你!
引擎:好的,我来执行一下它。
引擎:还有个事,我需要对a进行LHS查询(因为我要把2给它),你见过吗?
作用域:这个也见过,编译器把他生明为foo的一个参数了
引擎:OK,那现在我就把2给它。
引擎:我要为console进行RHS查询(因为我要执行console),你见过吗?
作用域:当然!console是一个内置对象,给你!
引擎:多谢,我来找找这有没有log()......找到了,是一个函数,我来执行一下。
引擎:我还需要对a做一个RHS查询(因为要执行log(a)),我当初把2给了它,它现在有什么变化吗?
作用域:放心吧,它没有动过,给你!
引擎:那我就把a的值传进来啦!
............
然后这有一个测试题,关于对LSH和RSH的理解:
function foo(a){
var b = a;
return a+b;
}
var c = foo(2);
我的理解是这样的:执行foo(2)会又一次RSH查询,然后传参时对a要进行一次LSH查询,执行 b = a时要对a进行一次RSH查询,然后对b进行一次LSH查询,执行return a+b时要对a和b分别进行一次RSH查询,最后将返回值赋值给c,这要进行一次LSH查询,所以这段代码一共有三次LSH查询和四次RSH查询 。