欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
[[scope]] 
 
 是函数创建时,生成的一个JS内部隐式属性,大致可以理解为作用域,它是函数存储作用域链的容器,而作用域链一般又存储着GO(全局的执行期上下文)和AO(函数的执行期上下文)。
 
函数的定义、执行、销毁三阶段
 
<script>
 
        function a(){
 
            var a = 1;
 
            function b(){
 
                var b = 2;
 
                function c(){
 
                   var c = 3;
 
                }
 
                c();
 
            }
 
            b();
 
        }
 
        a();
 
</script>
 
分析流程如下:
 
      首先是  a定义时: 产生[[scope]],里面存储着作用域链scope chain ,作用域链保存着全局GO
 
      a执行时(前一刻):一执行就会定义b,同时会有自己a函数的AO,并且会像栈一样把之前存储的GO挤到下面,(作用域链中AO和GO都是保存的引用地址值),若查找相关属性和函数,是自顶向下的,故先自己的AO,无再找GO。解释了就近原则。
 
    b定义时:因为a执行时就是b定义时,故两者的环境一模一样。其里面也存储者全局GO和a函数的AO
 
   b执行时:同理,b一执行就会定义c,同时产生b自己的AO,而且位于最顶端,如数组0下标存着b的AO,1下标存着a的AO,2下标存着GO
 
   c定义时:因为b执行时就是c定义时,故两者的环境一模一样。其里面也存储者全局GO和a函数的AO,b函数的AO
 
   c执行时:c里面已经没有函数了,故执行不定义新函数。只产生c自己的AO,而且位于最顶端,如数组0下标存着c的AO,1下标存着b的AO,2下标存着a的AO,3下标存着GO
 
   c销毁时:c执行完就会把自身c的AO销毁,所以环境又变成了b执行时的环境,然后轮到b执行完
 
    b销毁时:b执行完也会把自身b的AO销毁,注意,b的AO里面存着c函数和b变量,故c函数此时彻底没了,无作用域。环境又变成了a执行时的环境,然后轮到a执行完。解释了c函数可以访问a变量,a函数却不能访问c变量。
 
   a销毁时:a也销毁自身AO,只剩下全局GO,回到定义状态         
 
每运行函数一次都会执行销毁一次,每次都是新的,不调用则只有一个全局函数定义过程a
 
关于预编译就是AO,GO里面存储的什么下一篇在讲了,还有闭包基础就是销毁时通过return把当前环境保存一份让其他函数使用,原来的环境销毁了也不影响使用哪个环境的东西,这些都是相关联的。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64388.shtml