js 闭包的粗浅理解

本文深入探讨JavaScript中的闭包概念,通过实例解析其工作原理,包括如何在函数内部创建可访问外部变量的内部函数。闭包在防止变量污染、保护变量安全方面具有优势,但也可能导致内存消耗增加。文章还介绍了闭包在处理异步操作、循环中的应用及解决方案,展示了闭包在函数式编程中的重要角色。

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

闭包:在函数内部创建另一个函数,使得内部函数可以调用外部函数的参数与变量
1.

function fn(){
		var name = '冰冻黑熊';
		return function(){
			var n=0;
			return name;
			}
		}
		var fn1 = fn()
		console.log(fn1())//冰冻黑熊

上面这段代码中,创建一个匿名函数,这个函数在fn()作用域内部,可以获取name的值,将name作为返回值赋给全局域下的变量b,即实现全局变量下获取到局部变量中的变量的值。
2

function fn(){
	var num = 3;
	return function(){
		var n=0;
		console.log(++n);
		console.log(++num)
		}
	}
	ar fn1 = fn()
	// 内存消耗
	fn1()// 1 4
	fn1()//1 5

函数执行完时,里面的变量会被销毁,上面例子中,匿名函数作为返回值赋值给了fn1,且匿名函数引用fn中的变量Num,此时num无法被销毁。

3

for(var i = 0;i<5;i++){
	setTimeout(function(){
		console.log(i);//5 5 5 5 5
	},500)
}

js 单线程,执行for循环时,定时器并不会马上执行,而是加入等待队列中等待执行,等到定时器执行时,for循环结束,i的值变为5。
解决方法:

for(var i = 0;i<5;i++){
	(function(i){
		setTimeout(function(){
			console.log(i)
		},500*i)
	})(i);
}

使用闭包,将定时器封入执行函数中,将for循环中的i值作为参数传递

var num = 15
	var fn1 = function(x){
		if(x>num){
			console.log(x)
			return x
		}
	}
	var a= function(fn1){
		var num = 100;
		fn1(20)//20
	}(fn1)

通过闭包fn1作为参数传入a中,fnl(20)传入x中,此时Num取全局域(创建fn1函数的作用域),20>15,输出20

好处:a.防止变量污染,保护变量安全。
坏处:a.私有变量一旦被引用,便不能被销毁,会增大内存消耗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值