作用域链

来源:互联网 发布:sd卡数据怎么删除不了 编辑:程序博客网 时间:2024/06/15 14:29

执行环境及作用域:

       执行环境定义了变量或者函数有权访问的其他数据,决定了他们各自的行为,每个执行环境都有一个与之关联的变量对象(variable object)[[scope]],环境中定义的所有变量和函数都保存在这个对象中。我们编写的代码无法访问这个对象,解析器在处理数据时会在后台使用它。

       全局执行环境是最外围的一个执行环境。当某个执行环境中的所有代码执行完毕后,该环境被销毁,其中的所有变量和函数定义也被销毁。每个函数都有自己的执行环境,当一个执行流进入一个函数时,函数的环境就会被推入一个环境栈中去,函数执行完后,又会将其从该环境中弹出,把控制权交给之前的执行环境。

       当代码运行在一个执行环境中时,会创建一个作用域链,作用域链的用途就是确保对执行环境有权访问的所有变量和函数的有序访问。作用域链的开始始终是当前代码所在的执行环境的变量对象。如果这个执行环境是函数,就会将其活动对象作为变量对象(活动对象最开始的一个变量是arguments对象,但是它在全局环境中是不存在的),下一个变量对象就是该函数的外部执行环境中的,接着下一个变量对象来自下一个包含它的执行环境。一直到全局执行环境中的变量对象,全局执行环境的变量对象始终都是作用域链中的最后一个对象。

              varcolor  = "bule";

              functionsum(){

                     varanotherColor = "red";

                     functionswap(){

                            vartempColor = anotherColor;

                            anotherColor= color;

                            color  = tempColor;

                            console.log(color+ anotherColor + tempColor );

                     }

                     swap();

                     console.log(tempColor);//无法访问

              }

              sum();

              console.log(anotherColor);//无法访问

执行环境中的内部环境可以访问作用域链的所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。

没有块级作用域:

       Javascript中如if 、 for 等的语句中用var声明的变量会自动的被添加到他们所在的执行环境,即即使if 、for等的语句执行完毕,他们中定义的变量不会被销毁,还是可以在他的执行环境中可以访问到,如果变量的定义没有使用var关键字,则该变量将会被自动添加到全局执行环境中。

 

 

 

 

 

原创粉丝点击