作用域链

209 阅读2分钟

执行期上下文

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

[[scope]]:存的是作用域链,作用域链存储了执行期上下文集合。

查找变量:在哪个函数里查找变量,就在哪个函数的作用域链的顶端依次向下查找


function a(){
     function b(){

      var bbb=234;
      document.write(aaa);

}
var aaa = 123;
return b;
}

var glob = 100;
var demo=a();
demo();


a定义

//a.[[scope]] -->0:GO{}

a执行(产生执行期上下文ao,放到作用域链最顶端)

//a.[[scope]]-->0:AO{this:window

                                    arguments[]

                                    a:123

                                    b: function b(){}

}

                         1:GO{this.window 

                                     a:function a(){}

                                     glob:100

                                

}

a执行产生b定义

b执行(产生自己的执行期上下文ao,放到作用域最顶端)

b[[scope]]-->0:bAO{

                                   this:window

                                   arguments:[]

                                   b:234

}

                        1:  aAO {

                       

                                  this:window

                                  arguments[]

                                  a:123

                                  b: function b(){} 

                                 

}                         

                             2:GO{this.window

                               a:function a(){}

                               glob:100

 }

输出结果