闭包的生命周期,缺点,内存溢出和泄漏

闭包的含义

  1. 如何产生闭包?

    • 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包。

  2. 闭包到底是什么?

    • 使用chrome调试查看

    • 理解一:闭包是嵌套的内部函数(绝大部分人)

    • 理解二:包含被引用变量(函数)的对象(极少数人)

    • 注意:闭包存在于嵌套的内部函数中

  3. 产生闭包的条件?

    • 函数嵌套

    • 内部函数引用了外部函数的数据(变量/函数

    • 执行外部函数

    • 注意:调用外部函数才会产生闭包

闭包的生命周期

  1. 产生:在嵌套内部函数定义执行完时就产生了(不是在调用) //函数提升,内部函数对象已经创建了

  2. 死亡:在嵌套的内部函数成为垃圾对象时 //闭包死亡(包含闭包的函数对象成为垃圾对象)

闭包的应用:定义JS模块

  • 具有特定功能的JS文件

  • 将所有的数据和功能都封装在一个函数内部(私有的)

  • 只向外暴露一个包信n个方法的对象或者函数

  • 模块的使用者,只需要通过模块暴露的对象调用方法来实现对应的功能

(function() {
var test1 = "hello"
function fn1() {
 console.log("fn1()" + test1);
}

function fn2() {
  console.log("fn2()" + test1);
 }
 window.test2 = {
     fn1: fn1,
     fn2: fn2
   }
})()
test2.fn1()
test2.fn2()
function test1() {
 var test2 = "hello"
function fn1() {
   console.log("fn1:" + test2);
}

function fn2() {
 console.log("fn2:" + test2);
 }
return {
 fn1: fn1,
  fn2: fn2
  }
}
var test3 = test1()
test3.fn1()
test3.fn2()

利用闭包,向外暴露对象

闭包的缺点及其解决方法

  1. 缺点

    • 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长

    • 容易造成 内存泄漏

  2. 解决

    • 能不用闭包就不用

    • 及时释放:让内部函数成为垃圾对象 回收闭包

内存溢出与内存泄漏

  1. 内存溢出

    • 例子:
      var obj = {}
      for (var i=0;i<=1000,i++){
      obj[i]=new Array(1000000)
      }
    • 一种程序运行出现的错误

    • 当程序运行需要的内存超过了剩余的内存时,就会抛出内存溢出的错误

  2. 内存泄漏

    • 占有的内存没有及时释放

    • 内存泄漏积累多了就容易导致内存溢出

    • 常见的内存泄漏

      • 意外的全局变量

      • 没有及时清理的计时器或者回调函数

      • 闭包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值