JavaScript中的作用域

作用域精解

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

作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。
example:

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

定义一个a函数,在a函数中定义一个b函数,在全局中定义一个变量glod,赋值100.

当a函数被定义时,会产生一个名为a.[[scope]]的作用域链,然后在顶端会产生GO对象。

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

当a函数执行时:会在顶端产生AO对象,然后之前在顶端的GO对象会被顶到第二位。
a doing --> a.[[scope]] --> 0:aAO{}
1:GO{}
在这里插入图片描述

在这里插入图片描述

然后a函数执行,b函数开始定义,b函数会复制a函数的AO对象,拿来被自己所用:
b defined --> b.[[scope]] --> 0:aAO{}
1:GO{}
当b函数执行时,b函数会产生一个属于自己的AO对象:
b doing --> b.[[scope]] --> 0:bAO{}
1:aAO{}
2:GO{}

在这里插入图片描述

在这里插入图片描述

注意:
当b函数执行结束后,b函数会销毁自己执行时产生的AO 对象,并等待下次执行,下次执行时就会重新产生一个AO对象。
a函数也是一样,执行结束后会销毁自己执行时产生的AO 对象,并等待下次执行,下次执行时就会重新产生一个AO对象。
运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕时,它所产生的执行上下文会被销毁。
差找变量:从作用域链的顶端依次向下查找。

猜你喜欢

转载自blog.csdn.net/Hhjian524/article/details/82950890