简单理解js全局变量、局部变量和闭包

全局变量就是在函数外声明的变量,整个网页中所有脚本和函数都可以访问它,页面关闭后删除这个变量。
局部变量就是在函数内声明的变量,只有在函数内才能访问它,函数执行完毕这个变量删除。(函数内部声明变量一定要使用var,不然就是声明了一个全局变量)
局部变量可以改变全局变量的值
闭包是一个内嵌函数访问它的上级函数的局部变量,当上级函数运行完后这个变量是不会被删除的。

举一个闭包的例子:

<script>
	 function A(){  
	      var i = 0;
	      console.log("A中的i:"+i)
	      return function(){
	          i++;
	          console.log("闭包中的i:"+i)
	      }
	  }     
	  var B = A();
	  B();B();B();B(); 
</script>

最近输出结果如下:
在这里插入图片描述
函数A中的匿名函数就是一个闭包,它能读取上级函数的内部变量。

为什么i的赋值以及第一个console语句只执行一次?
是因为在var B=A()这里,把函数A赋值给变量B,即函数A运行了一遍,并且把匿名函数return给了B,所以只有在这里进行赋值了,之后的B函数实际上就是A内部的匿名函数,所以之后的B()就是运行了A内部的匿名函数而已。
只要B没有被重新赋值,A()就没有被释放,变量i就不会被重新初始化。

为什么A中的变量没有在A执行完后销毁?
因为A中的匿名函数被赋值给了一个全局变量,所以这个匿名函数一直存在于内存中,而匿名函数依赖于函数A,因而A也一直存在于内存中,所以变量i也一直存在没有被销毁,不会被垃圾回收机制回收。

闭包的优点

  1. 可以访问函数内的局部变量
  2. 可以让这些变量始终保存在内存中
  3. 防止污染全局变量。

闭包的缺点

  1. 使用闭包不当会造成很多变量保存在内存中,造成性能问题,出现内存泄漏

如果闭包不需要了,直接B=null;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值