JavaScript内核笔记06-闭包

本文探讨了JavaScript中的闭包概念,阐述了如何在函数内部创建闭包,并列举了其三大用途:匿名自执行函数、缓存和实现封装。同时,文章也提到了闭包可能导致的内存泄漏问题和在处理this引用时的陷阱。通过实例解析,帮助读者深入理解闭包的工作原理及其潜在风险。

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

如果在函数内部生命函数inner,然后在函数外部调用inner,这个过程即产生了一个闭包。

闭包的用途:

1、匿名自执行函数,类似:click(function(){})。

2、缓存。

3、实现封装。闭包的的一个重要用途就是实现面向对象中的对象。传统的对象语言都提供类的模板机制,这样不同的对象就拥有了独立的成员和状态,互不干涉。

虽然JavaScript没有这种机制,但是我们可以使用闭包实现该机制,如下程序:

//JavaScript是基于对象而非面向对象的,若想实现面向对象,则需要使用闭包
function Person()
{
	var name='default';
	return {
		getName:function()
		{
			return name;			
		},		
		setName:function(newName)
		{
			name=newName;			
		}
		
	};
};

var jake=Person();
alert(jake.getName());
jake.setName('jake');
alert(jake.getName());

var jay=Person();
alert(jay.getName());
jay.setName('jay');
alert(jay.getName());

应该注意的问题:

1、内存泄漏,JavaScript解释器都具备垃圾回收机制,一般采用的是引用计数的形式,如果一个对象的引用计数为0,则垃圾回收器会将其回收,这个过程是自动的。

 但是有了闭包后,变量的应用将变的比较复杂,因为局部变量肯能会在某个时刻被外部应用,如果再出现嵌套引用等情况,则会出现无法回收的泄漏。

2、上下文引用this,它表示的是调用对象的引用,而在闭包中,最容易出现错误的地方就是误用this。虽然闭包可以引用局部变量,但是涉及到this的时候,情况就不对了,

如下例:

//闭包中this变量的使用
function aa()
{
	var obj=document.getElementById('name');
	this.value='1000';//此处的this表示调用的对象
	obj.οnclick=function()
	{
		alert("触发该事件的对象this:"+this.value);//此处的this其实是本方法的触发对象obj,而并非上一句中的this,故其值也非1000
	};
	
	//解决闭包的局部this引用问题
	var self=this;
	obj.οnmοuseοver=function()
	{
		alert("局部变量的this:"+self.value);		
	};
}
aa();//如果在这里执行调用对象就是window
alert(window.value);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值