javascript ECMAScript-闭包

本文深入浅出地介绍了JavaScript中的闭包概念,从作用域的概念出发,详细解释了闭包的工作原理,并通过具体示例展示了如何利用闭包实现数据隐藏及保护。

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

 前面总结的很简单。需要有一定javascript的语法基础。如果有不对的地方,还请指正。吐舌头

闭包

首先,我们先来聊一聊作用域 ,作用域,是一种环境,变量所处的环境,一个function(){} 会创建一个作用域,

<pre name="code" class="javascript">var a = 10;
function test(){
	var a = 20;
	return a;
}
var b = test(a);
alert(a);//10
alert(b);//20

上面的栗子中,全局变量 a  和 函数内变量 a 是两个不同的变量,输出的是两个不同的值

var a = 10;
function test(){
<span style="white-space:pre">	</span> a = 20;
	return a;
}
var b = test(a);
alert(a);//20
<pre name="code" class="javascript">alert(b);//20

这个栗子却输出了20,前面说过,没有var关键字,会被赋值到window对象上,所以他们相当于两次赋值 ,那么问题来了,函数内的作用域是一个环境,怎么能用全局环境的值呢?

这里就要说一说延长作用域链,当一个变量在当前环境内没有找到声明时,会沿着作用域链访问活动对象,这是栗子中,window对象,就是test函数t的活动对象,变量a没有在函数内声明,他会访问活动对象,如果没有找到。返回undefined。

到了这里,我们就要说一说今天的猪脚。闭包。函数有自己的作用域,这个作用域,通过外部是访问不到的。栗子

var a = 10;
function test(){
	var b = 20;
}
alert(a);//10 
alert(b);//error
函数执行到alert(b)的时候。报错了,因为找不到变量b,作用域可以向上查找,但是不能反方向查找,这一点要牢记。

那么,我们如何访问变量b呢 :栗子

var a = 10;
function test(){
	 var b = 20;
	 return b;
}
alert(a);//
// alert(b);这里我们注释了
alert(test());
没错,就是return ,函数返回了变量b,当然,如果你alert(b),还是会报错,只不过,我们换了一个思路,调用函数,返回他的值。我们不需要变量名,而是他的值。

这就是闭包的一个简单的例子。 来个复杂的栗子

function test(){
	 var b = {num:20};
	 return {
	 	getNum:function(){
	 		return b.num;
	 	},
	 	setNum:function(num){
	 		b.num = num;
	 	},

	 }
}
alert(test().getNum());//20
test().setNum(30);
alert(test().getNum());//30
如果我们声明了一个对象,我不想别人直接操作他,而是给他两个方法,一个获得,一个设置。这样。我的对象就被保护起来。保证结构不被破坏,就像DOM和BOM提供的API一样。只是给了你一个调用的方法。这是一个闭包很好的作用。闭包,就说到这里,还有一些要点,被许多的大牛提到过,不再累述。如果有不对的地方,还请指正。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值