JS学习笔记 之 作用域链

作用域,作用域链精解
函数          -->     函数类对象
可访问的属性:包括test.name test.prototype等
不可访问的属性:如test.[[scope]]
       ↓                               
                        由于函数执行而产生的作用域链->存储了执行期上下文的集合 ->呈链式连接
仅供javascript引擎存取                                                    ↓
                                                 函数每次执行时,对应独一无二的执行期上下文,执行完毕即销毁
 
(在某函数中)查找变量:从(该函数的)作用域链顶端,依次向下查找
 
作用域链图解
注意:下例中,b的定义是在a执行时产生的,a没有执行的话就没有b的定义
 1  function a(){
 2      function b(){
 3         var b = 234;
 4       }
 5      var a = 123;
 6      b();
 7  }
 8         
 9  var glob = 100;
10  a();
访问变量时,查找的是执行时的作用域链
a defined:      -->     0 : GO    全局中的函数被定义时,生成全局的上下文
a execute:      -->     0 : AO    全局的函数执行时,产生自己的独一无二的执行期上下文,链接到全局的上下文,形成自己的作用域链
                                1 : GO
 
b defined:       -->    0 : aAO    局部的函数被定义时,首先拿到已有的外部函数的上下文
                                 1 : GO
b execute:       -->     0 : bAO    局部函数执行时,生成自己的独一无二的执行期上下文,链接到先前已经拿到的外部函数的上下文
                        -->     1 : aAO
                        -->     2 : GO
 
 

b在a内部定义,直接继承了a的作用域链(直接引用,指向的就是原来A的AO),接着,在执行时,将生成的自己的AO链接到继承的作用域链的顶端

原文地址:https://www.cnblogs.com/seveinn/p/11801893.html