[[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