JS学习--作用域

1、作用域概念

     所谓的作用域就是[[scope]],其中存放了运行期上下文的集合。根据预编译的讲解得知,运行期上下文就是指AO,GO对象。

     作用域链:[[scope]]中存储的是运行期上下文的集合,而这些集合均以链式链接,因此将这种连接称为作用域链。

     运行期上下文:当函数在执行时,会创建一个运行期上下文的内部对象。一个执行期上下文定义了一个函数的执行环境,并且函数每次执行所产生的运行期上下文都是独一无二的,即函数多次运行则会产生多个运行期上下文的对象。当函数执行完毕后,它所产生的运行期上下文会被销毁。

      变量查找:从作用域的最顶端依次向下查找。

2、案例

   2.1 案例一

      function a(){

          function b(){

              var bb = 234;

              a = 0;

          }

     var a = 123;

     b();

    console.log();

}

var glob = 100;

a();

产生执行期上下文:

(1) 当a函数定义时,会产生一个运行期上下文GO:

                         

 

(2) 当a函数执行时,在已有GO的情况下,会产生一个运行期上下文AO:

                          

 

(3) 当a函数执行时,a函数中存在函数b,因此a函数执行时,会存在b函数的定义,由于b函数属于a函数内部,并且处于a函数执行时,因此b函数所产生的执行期上下文是a函数执行时所产生的上下文

                                         

 

(4) 当b函数执行时,会在原有的上下文的基础上再次创建一个执行期上下文。

                                   

       注意:改变函数b中变量:aa = 0;则在函数a中再次访问aa,依然会打印aa.

      说明b函数在定义或在执行时所存在的GO对象以及其中的一个AO对象均是函数a所给的,因此,当函数b修改了AO对象中的某个变量值,a函数中的执行期也会相应的发生改变。

消除执行期上下文:

当函数执行完毕后,执行期上下文均会被干掉。

 

2.2 案例二

    function a(){

           function b(){

                 function c(){}

                 c();

          }

         b()

 }

函数讲解:

     (1) a defined a.[[scope]] ---> 0:GO

       a doing a.[[scope]] ---> 0:AO【属于函数a】

           1:GO

       b defined b.[[scope]] ---> 0:AO【属于函数a】

           1:GO

        b doing b.[[scope]] ---> 0:AO【属于函数b】

           1:AO【属于函数a】

            2:GO

       c defined c.[[scope]] ---> 0:AO【属于函数b】

            1:AO【属于函数a】

            2:GO

       c doing c.[[scope]] ---> 0:AO【属于函数c】

            1:AO【属于函数b】

           2:AO【属于函数a】

           3:GO

2.3 案例二

         function a(){

             function b(){

                 var bbb = 2324;

                 console.log(aaa);

              }

          var aaa = 3;

           return b;

}

var glob = 100;

var demo = a();

demo();

(1) 首先定义a函数时,会产生GO对象

     GO: this window

      window object

     document object

      a function

      glob 100

      demo function

(2) 执行函数a,

   AO:

      this window

      arguments []

      b function

      aaa 3

   GO:

      this window

      window object

      document object

      a function

      glob 100

      demo function

(3) 定义函数b

   AO:

      this window

      arguments []

      bbb 2324

AO:

      this window

      arguments []

      b function

      aaa 3

 

GO:

      this window

      window object

      document object

      a function

      glob 100

      demo function

      由于函数a中没有执行函数b,因此b处于等待执行的过程中,而函数a执行的最后一句为return b,该语句执行完成后,代表a函数执行完毕,则会销毁执行期上下文对象,因此函数a所有的对象全部会被销毁,而b的对象来自于a,按正常情况应该会被销毁。但是在函数的最后,将b返回给demo,因此b的作用域链不会被取消,依然保持存在。

(4) demo = a();//结果为b的作用域链被保存

      demo的执行期上下文对象为:

  AO:

      this window

      arguments []

      b function

      aaa 3

GO:

      this window

      window object

      document object

      a function

      glob 100

      demo function

(5) demo();执行过程

  AO:

      this window

      arguments []

      bbb 2324

  AO:

      this window

      arguments []

      b function

      aaa 3

  GO:

      this window

      window object

      document object

      a function

      glob 100

      demo function

打印结果为:3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值