你不知道的JavaScript之理解作用域(1)

版权声明:转载请注明出处,欢迎交流哦! https://blog.csdn.net/zdhui_fly/article/details/80945044

理解作用域

对于语句 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查询 。

猜你喜欢

转载自blog.csdn.net/zdhui_fly/article/details/80945044