javascript闭包

javascript变量:局部变量和全局变量。

在javascript中,在函数内部可以直接读取全局变量,在函数外部无法读取函数内的局部变量。

<script type="text/javascript">
	var MAX_LEN = 5;
	function test(){
		return MAX_LEN * 10;
	}
	alert(test()); // 50
</script>
需要注意的是,在函数内部的变量的定义一定要声明为var.否则默认为全局变量(当然你需要先执行这个函数)。

<script type="text/javascript">
	function test(){
		MAX_LEN = 10;
	}
	test();
	alert(MAX_LEN); // 10
</script>

现在考虑要怎么才能在外部读取局部变量。

方式1:可以直接return该局部变量即可。

<script type="text/javascript">
	function test(){
		var maxLen = 10;
		return maxLen;
	}
	var maxLen = test();
	alert(maxLen);
</script>
方式2:可以提供一个对应的function,然后返回该function。

<script type="text/javascript">
	function test(){
		var pointX = 5,
			pointY = 10;
		function getX(){
			return pointX;
		}
		return getX();
	}
	alert(test());
</script>
上面的这种还可以写成这种方法。
<script type="text/javascript">
	function test(){
		var pointX = 5,
			pointY = 10;
		function getX(){
			return pointX;
		}
		return getX;
	}
	alert(test()());
</script>

如果要返回多个局部变量怎么处理,我们知道javascript中有:

<script type="text/javascript">
	var Strong = {
			version : '1.0.0',
			author : 'xuzengqiang',
			time : '2014-12-23'
		};
	alert(Strong.version);
</script>
所以对于上例中如果要同时返回pointX和pointY,可以写成:

<script type="text/javascript">
	function test(){
		var pointX = 5,
			pointY = 10;
		return {
			x: pointX,
			y: pointY
		};
	}
	alert(test().x + '-' + test().y);
</script>

通过上面这些例子,我们可以浅显的认为:闭包就是可以访问函数局部变量的函数(当然它的功能并不局限于此),所以在方式二中所提供的getX()就可以看做成一个闭包。

闭包的用途:

1、可以在外部读取函数内部的局部变量。

2、可以使得这些局部变量被保存到内存中。

如何理解,且看:

<script type="text/javascript">
	function test(){
		var result = 100;
		//相当于全局变量,不是局部变量,也称作匿名函数,匿名函数本身也是一个闭包,可以通过这种方式对局部变量进行操作。
		add = function(){
			result += 1;
		}
		function printResult(){
			alert(result);
		}
		return printResult;
	}
	var res = test();
	res(); //100
	add();
	res(); //101
</script>
调用res()实际上就是调用tes()函数中的printResult()闭包函数。第一次打印100.第二次打印101,说明了函数test中的result一直被保存在内存中,并没有在调用完test()之后立即被清除。

为什么:因为printResult()被作为返回值赋给了全局变量从而保存在内存中,而函数test()是pintResult的父函数,所以函数test()也被保存到内存中,从而不会在调用完成之后被垃圾回收机制回收。

注意:

1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大。所以不能滥用闭包,否则可能会带来性能问题,且IE下可能会导致内存溢出,解决方法:在调用完函数之后,删除多余不使用的局部变量。

2、闭包可以在父函数外部修改父函数局部变量的值,因此如果你把父函数当作对象使用,且闭包被当作公有方法,而局部变量是私有的情况下,尽量避免不要随意改动局部变量的值。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值