js 深度学习(五)

作用域和作用域链

function a(){
	function b(){
		var b = 2
	}
	var a = 1;
	b();
}
var c = 3;
a()

当全局函数a被定义时,系统生成[[scope]]属性,[[scope]]属性保存在函数的作用域链,作用域链的第0位存储当前环境下的全局执行期上下文GO,GO里存储全局下的所有对象,包含函数a和全局变量c
每一个函数的作用域链上都有GO
当a函数被执行时(前一刻):生成自己的AO,放在作用域链的最顶端
当b函数被定义时:是在a函数环境下 所以b函数这时的作用域链就是a函数被主席那个期的作用域链
当b函数被执行时(前一刻):生成自己的AO,放在作用域链的最顶端,a函数的AO和GO一次向下排列
当b函数被执行完:b函数的AO被销毁,回归被定义时的状态
当a函数被执行完:a函数的AO被销毁的同时,b函数的[[scope]]也将不存在,回归被定义时的状态
函数被定义时生成作用域和作用域链 函数被执行时生成自己的AO

闭包

function test1(){
	function test2(){
		a = 2;
		console.log(a)
	}
	var a = 1;
	return test2();
}
var c  = 3;
var test3 = test1()'
test3();

test3执行。test2的作用域链增加自己的AO,当打印a的时候,在自己的AO上没有找到,则向test1的AO查找,再次执行test3时,实际操作的仍然是原来test1的AO
当内部函数被返回刀外部函数并保存时,一定会产生闭包,闭包会产生原来的作用域链不释放,过渡的闭包会导致内存泄漏,

你可能感兴趣的:(javascript,开发语言,ecmascript)