[ javascript ] 一切皆为闭包!

本文探讨了JavaScript中闭包的概念,通过实例展示了闭包如何导致全局变量被锁定在内存中,阐述了全局作用域中的闭包特性,并讨论了避免使用全局变量的原因。

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

我记得我曾经说过,一切皆为闭包!

关于闭包可能很多人第一时间会想起这样一句代码:

var foo = function(){
          var i = 0;
          return function(){
              console.log(++i);
          }
      var bar = foo();
      bar();

是的,这确实是一个闭包,这是由于函数的作用域引起的。

内部函数访问变量,需要查询到外部的作用域,所以JS将外部作用域中的i保留下来,且只有bar的作用域能够访问。


那么我今天突然想到曾经碰到的问题,一切皆是闭包,为什么呢?

于是做一猜想如下,如果将这上面的i放到全局作用域中,会是怎么样的情况呢?

以前不是说一切都是闭包么,全局的作用域应该也是的

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

输出结果如下:


于是根据我理解的作用域概念,这里的for循环是没有块级作用域的,那么可以直接忽略。

在function() 中保留了对全局变量i的引用,所以导致了全局作用域中的i在内存中locked.

从这里,我似乎找到了一丝关于js中一切皆是闭包的证据。


清晨起来,似乎想起一些其它的情况,当它不是自启动函数的函数,而只是一个简单的全局函数变量的时候

是否会符合上述的规律呢?故做如下一测试:

 var i = 0;

	 var test =  function(){
		 console.log(++i);
	  };
	  test();
	  test();
	  test()


哈哈,结果果然不出所料如下,变量i依旧被locked在内存中:


这与当初猜想结果不谋而合,似乎多一些证据的存在。我也这是为什么我们建议不要使用全局变量的一个原因吧。

虽然大多数都在强调会导致变量污染。但在这里,会导致变量被锁在内存中,从而导致内存增加,甚至严重内存泄露。


个人观点,学有所得,记录之,以防遗忘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值