对闭包的理解

闭包的理解

闭包就是外部函数访问内部函数的变量。要理解闭包,就要理解作用域链。什么是作用域?作用域就是执行期上下文对象的集合。函数每次执行的时候就会创建自己的执行上下文,执行完后就销毁。查找变量的时候从作用域的顶端往下查找。闭包呢就是将函数内部的变量保存在了外部,内部函数执行完之后,销毁自己的执行期上下文,但是他自己的执行期上下文也被外部函数带着的,保存在了自己的作用域链上,当外部调用函数时就会在作用域链上找变量,因此可以访问其变量。
举个栗子:

function a(){
	function b(){
		var bbb = 234;
		document.write(aaa);
	}
	var aaa = 123;
	return b;
}
var glob = 100;
var demo = a();
demo();

在这里插入图片描述
看图就是a在return b后就执行完了销毁了自己的上下文,相当于剪断[[scope chain]]0的线,但是b那里还有,函数b已经被保存在外面了,还是能在自己的上下文访问到函数a里面的变量,并且b上下文里面的a AO和a自己的AO是一样的,如果变量更改了,那么这两个同时更改。
这样就导致了闭包的缺点
闭包会导致原有作用域链不释放造成内存泄露
什么是内存泄露?我们可以理解为:闭包产生的变量会存在内存里,内存的剩余量会越来越少。这样理解就可以了。

闭包的作用

闭包实现公有变量,如函数累加器。

function test(){
	var count = 0;
	function b(){
		count ++;
		console.log(count);
	}
	return b;
}
test();//每次执行都会在原有的基础上加1

闭包可以做缓存。

function eater(){
	var food = "";
	var obj  = {
		eat:function(){
			console.log(' i eat ' +food);
			food = "";
		},
		push:function(myFood){
			food = myFood;
		}
	}
	return obj;
}
	var eat1 = eater();
	eat1.push('banana');
	eat1.eat();

闭包可以实现封装,属性私有化。
闭包可以防止污染全局变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值