JavaScript学习笔记——作用域、作用域链

深入学习作用域与作用域链,能帮我们更好的理解闭包。而学习作用域和作用域链前,我们先得掌握预编译中出现的执行期上下文

1. 执行期上下文

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

2. 作用域 [[scope]] 与作用域链

2.1 [[scope]]

[[scope]]是一个隐式属性,仅供javascript引擎存取,[[scope]]指的就是作用域,是存储了执行期上下文的集合

2.2 作用域链

[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链,在哪个函数中查找变量,从该函数的作用域顶端依次向下查找

案例分析

function a() {
	function b() {
		var b = 234;
	}
	var a = 123;
	console.log(a);
	b();
}
var glob = 100;
a();

按照预编译的知识,首先先创建GO对象,而GO对象正创建在a.[[scope]]中。
另一种理解方式,a被创建时,a.[[scope]]中所存储的是当前环境的执行上下文对象,而a被定义在全局中,所以存储的是GO对象

a()函数被定义
a.[[scope]] --> 0 : GO {}

JavaScript学习笔记——作用域、作用域链_第1张图片
a( )被执行时,创建AO对象,放在作用域的顶端,形成作用域链

a()函数被执行
a.[[scope]] --> 0 : AO {}
				1 : GO {}

JavaScript学习笔记——作用域、作用域链_第2张图片
在执行console.log(a)时,会随着作用域链从上往下依次寻找a变量,在AO中找到,所以执行结果为123
当b( )函数被定义时,会拿到a( )函数执行的“成果”。因为b.[[scope]]中所存储的是当前环境的执行上下文对象,而b( )函数在a( )函数执行时被定义,b.[[scope]]中存储的为a( )函数执行时的执行期上下文此为学习闭包的基础,务必理解

b()函数被定义
b.[[scope]] --> 0 : AO {}(a函数的AO1 : GO {}

在b( )函数被执行时,则会产生自己的AO对象,放在作用域链的最顶端

b()函数被执行
b.[[scope]] --> 0 : AO {}(b函数的AO1 : AO {}(a函数的AO2 : GO {}

b( )函数执行完后,解除与自己AO{}的连线,恢复到被定义状态,等着下一次执行。此代码中,b( )执行完代表着a( )函数也执行完毕(b( );为a( )函数的最后一条语句),此时,a( )函数也会切断与自己AO{}的连线,而a( )的AO{}中存储的变量b( )函数同时被销毁(等不到下次被执行了),a( )函数恢复到被定义状态,等待下一次被执行,下一次执行a( )时,产生一个新的执行上下文放在作用域链最顶端,进而又产生一个全新的b( )函数…周而复始

思考

function a() {

	function b() {
	
		function c() {
		
		}
		c();
	}
	b();
}
a();

在哪个函数中查找变量,就是在该函数执行后的作用域链中自顶向下依次寻找

	a()定义 a.[[scope]] --> 0 : GO{}
	
	a()执行 a.[[scope]] --> 0 : AO{}(a)
	                    	1 : GO{}
						
	b()定义 b.[[scope]] --> 0 : AO{}(a)
	                    	1 : GO{} 
						
	b()执行 b.[[scope]] --> 0 : AO{}(b)
							1 : AO{}(a)
	                    	2 : GO{} 
						
	c()定义 c.[[scope]] --> 0 : AO{}(b)
							1 : AO{}(a)
	                    	2 : GO{} 
						
	c()执行 c.[[scope]] --> 0 : AO{}(c)
							1 : AO{}(b)
							2 : AO{}(a)
	                    	3 : GO{} 

此表可清晰解释,为什么外部函数无法访问内部函数的变量,而内部函数可访问外部函数的变量?

你可能感兴趣的:(JavaScript,前端,学习总结)