js闭包

本文深入探讨了JavaScript中闭包的概念,解释了闭包如何形成及为何可能导致内存泄露。通过两个具体示例,详细分析了函数作用域链的保存与执行过程,帮助读者理解闭包的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闭包
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。

例子1:

 function a() {
	 function b() {
		 var bbb = 123;
		 document.write(aaa);
	 }
 	var aaa = 123;
 return b;
 }
 var glob = 100;
 var demo  = a();// demo 保存的就是b函数
 demo();// demo 执行,相当于b函数执行

这个例子中a函数返回了b函数的整体,b函数被返回到了外部。因此形成了闭包。

当b函数被保存出来之后:b被定义时,a执行时的作用域链被保存到了b的作用域链中.
b定义时:
b: scope chain [0] --> AO(从a函数保存下来的)
scope chain [1] --> GO
b执行时:
b: scope chain [0] --> AO(b自身产生的)
scope chain [1] --> AO(从a函数保存下来的)
scope chain [2] --> GO

例子2:

function a(){
	var num = 100;
	function b(){
		num++;
		console.log(num);
	}
return b;
}
var demo = a();
demo();
demo();

demo保存的b函数,然后将demo执行两次 结果 num = 102
很多的人会认为结果应该是101,其实不是。、

分析:
当b被定义时,b保存了a的作用域链
b: scope chain [0] --> AO(从a函数保存下来的)
scope chain [1] --> GO
当b执行时,
b: scope chain [0] --> AO(b自身产生的)
scope chain [1] --> AO(从a函数保存下来的)
scope chain [2] --> GO
b的AO(执行期上下文)没有变量,而函数体里面执行num++,那么将从作用域向下查找变量num,num属于来自a的AO,当demo执行一次时,num++,AO里面的num = 101;当demo执行第二次时,num++ ,num = 102。

注意:因为b保存了a的作用域链,所以当a执行完毕后,虽然自身的执行期上下文被销毁,但是,a的作用域链已经被保存出去了,所以原作用域链不能被释放

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crazy的蓝色梦想

如果对你有帮助,就鼓励我一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值