JavaScript之闭包

官方对闭包的解释:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
我们也可以这样解释闭包:闭包是可访问上一层函数作用域里变量的函数,即便上一层函数已经关闭。

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

我们先可以这样总结闭包:
闭包找到的是同一地址中父级函数中对应变量的值(可以这样把外部函数的返回值(函数)存给变量,再用变量调用外部函数返回值函数(变量名()),这里保证每次访问地址一样)。每次外部函数执行时,外部函数的引用地址不同,都会重新创建一个新的地址

在这个例子里,我们首先调用了外部函数并把函数返回值赋给一个变量,此时变量存储的是地址,函数返回值又是一个函数,当我们用变量执行函数时,即产生了闭包,每次调用地址一样,故每次调用都会让父级函数里num变量执行+1操作。

闭包的优缺点
优点:可以访问局部变量。
缺点:局部变量一直占用内存,内存占用严重,还容易造成内存泄漏(内存被占用,剩余的内存变少,程序加载、处理速度变慢)。

闭包的用途:

  • 实现公有变量:如第一个例子做累加器
  • 可以实现封装,属性私有化
function person() {
	var name = "小王";
	return {
		getName: function() {
			return name;
		},
		setName: function(newName) {
			name = newName;
		}
	}
}
var p = person();
console.log(p.name); //undefined
console.log(p.getName()); // "小王"
p.setName("小花"); 
console.log(p.getName()); //小花
  • 模块化开发,防止污染全局变量
var a = (function(j) {
	return function() { console.log(j) }
	//模块内的函数变量不会被外部函数所污染,且执行完立即被销毁,不会浪费空间
})(10);
a();

闭包使用注意点:
滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄漏。解决方法是,在退出函数之前,将不使用的局部变量全部删除。我们可以将函数置为null这样闭包使用完,变量就会被释放

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值