JS中的作用域与作用域链

版权声明:转载请注明来源 https://blog.csdn.net/BigDaruizi/article/details/82389787

一、相关知识

1、执行期上下文

函数执行的前一刻,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕时,它所产生的执行上下文会被销毁。

2、作用域

每个JavaScript函数都是一个特殊的对象,对象中有的属性我们可以访问,但有的不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个,[[scope]]就指的是作用域,其中存储了运行期上下文的集合。

3、作用域链

每个函数执行的时候都有自己的执行环境。当代码在一个环境中执行的时候,会创建对象的一个作用域链(scope chain),也就是[[scope]]中所存储的执行期上下文对象的链式集合链接。

注意点:查找变量是从作用域链的顶部依次向下查找。全局执行环境是最外围的一个执行环境,在Web浏览器中,全局执行环境被认为是window对象。某个执行环境中的所有代码被执行完毕之后,该环境会被销毁,保存在其中所有的变量和函数定义也会随之被销毁。

二、全局环境与局部环境 

       内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的、有次序的。在每个环境中都可以向上搜索存在的作用域链;但是任何环境都不能通过向下搜索作用域链而进入另一个执行环境。(注:本实例来自于《JavaScript高级程序设计》一书)

           var color = "blue";
           
           function changeColor () {
               var anotherColor = "red";
               
               function swapColor (){
               	  var tempColor  = anotherColor;
                  anotherColor =color;
                  color = tempColor;
                  //这里可以访问color、anotherColor和tempColor
               }
               
               //这里可以访问color、changeColor,但是不能访问tempColor
               swapColor();
           }
           //这里只能访问color
           changeColor();

三、图解作用域链创建过程

以如下代码程序为例,用图来解释:

           function a () {
             	function b () {
           		    var  b = 234;
             	}
              	var a = 123;
           	    b();
             }
                var glob = 100;
                a();

猜你喜欢

转载自blog.csdn.net/BigDaruizi/article/details/82389787