js学习小记-----闭包

难道是因为别的同学都出去跨年了所以我学习的心被打乱了吗,我竟然把我闭包的笔记删掉了。。。当看到的时候,脑壳一阵昏,下面给他补上。

在我们学习js的过程中肯定都接触过闭包,所以大家也都知道闭包的重要性,那么什么是闭包呢?
闭包就是在一个函数的内部定义了另外一个函数,并且把它拿到了外部来执行,这就是闭包,并且这个被抛出来的函数还会一直拿着父级函数的作用域中的值,正常情况下一个函数执行完就会被销毁,但是因为闭包的原因,他的作用域并不会被销毁,所以就造成了内存泄漏。内存泄漏这个名词需要好好理解的。(setTimeout()中写的是一个字符串而不是一个函数也会造成内存泄漏)
请看下面这个经典的for循环中产生闭包的例子:

for(var i = 0; i < 10; i++){
				setTimeout(function(){
					console.log(i);
				}, 1000);
			}

这个循环应该输出什么呢? 这个循环我们写出他就是想让他输出0-9这十个数字,但是他并不会满足我们的愿望,因为他输出了十个10,大家是不是很好奇,为什么会是十个10呢,怎么说也应该十个9吧。这是因为i的最后一个值是10,当i= 10时就不在进行循环,所以i最后的值等于10,那么肯定也就输出十个10了,像这种情况就是形成了闭包,还有一种情况也是闭包:

function fn(){
			var a = 10;
			function fun(){
				console.log(a);
			}
			bar(fun);
		}
		
		function bar(foo){
			foo();
		}
		fn();

形成闭包我们应该怎么解决呢? 就拿第一个for循环来说,使用立即执行函数可以完美的解决闭包的问题:

for(var i = 0; i < 10; i++){
			(function(j){
				setTimeout(function(){  //这个括号里不能填j 否则会打印出undefined
					console.log(j);
				},1000)
			}(i));
		}

这样就会按照我们理想中打印出0-9了。闭包有好也有坏,在实际应用中用到的次数还是挺多的,有时候发现一个函数执行结果并不是预期中那样,那就要看看是不是闭包在搞鬼了。
希望本篇小记对你有帮助吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值