对于闭包,很长一段时间以来都困扰了我,之前写过一篇闭包的文章,后来感觉解释的还是不够好,所以自己还是多查了一点资料,把自己对闭包的理解记录下来,希望大家在前端的路上,不断坚持,总会收货.
好了,现在我们步入正式的话题,之前对闭包的理解的不清楚一点在于,我只是停留在概念上,知道A函数里面嵌套B,那么B函数里面引用了A函数的局部变量,那么B函数就称为一个闭包,这里我们可以更具体一下,闭包其实函数B内部一个含引用局部变量(可以是变量/函数)的对象,所以闭包实际上隐藏在内部函数里面的一个对象,这个就会把局部变量保存下来了,闭包具体查看可以通过chorme的debug调试工具:
总结一下闭包是什么:

  • 包含被引用变量的对象
  • 存在于嵌套的内部函数中

闭包的产生:

产生条件:

  • 函数嵌套
  • 内部函数引用了内部函数的数据(变量/函数)
  • 外部函数调用

我们先用var关键子声明变量


上面是var声明的变量,因为var声明的变量会存在变量提升,所以es6给出了两种新的命名变量的方式:let 和const我们再来看下吧
这里注意一个细节,没有return函数也是没有闭包产生的

要想f2f3都产生闭包,可以这样做:

闭包的作用:

  • 使得函数内部的变量在函数的执行完,仍然存活在内存中(延长了局部变量的声明周期)
  • 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

生命周期:

  • 产生:在嵌套内部函数定义执行时就产生了(不是调用的时候)
  • 死亡:在嵌套的内部函数成为垃圾对象的时候

我们再来理解一个什么叫在嵌套的内部函数成为垃圾对象的时候这句话

产生多个闭包:

  • 外部函数调用几次就产生几个闭包

闭包的缺点:

  • 函数执行完,函数内部的局部变量没有释放,占用内存的事件会变长
  • 容易造成内存的泄露

解决方法

  • 能不用闭包就不用闭包
  • 在使用完可以将对函数内部对象的引用的变量赋值为空,那上面的图来说可以将fn=null

内存溢出和内存泄露

  1. 内存溢出
  • 一种程序运行出现的错误
  • 当程序所需要的内存超过剩余的内存的时候,就会抛出内存溢出的错误
  1. 内存泄露
  • 占用的内存没有及时释放
  • 内存泄露积累多了就容易导致内存溢出
  • 常见的内存泄露
  1. 意外的全局变量
  2. 没有及时清理的定时器和回调函数
  3. 闭包

解决js中无敌神兽---闭包相关推荐

  1. js浮点数精度丢失问题及如何解决js中浮点数计算不精准

    js浮点数精度丢失问题及如何解决js中浮点数计算不精准 参考文章: (1)js浮点数精度丢失问题及如何解决js中浮点数计算不精准 (2)https://www.cnblogs.com/ranyonsu ...

  2. promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

    * promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...

  3. 彻底了解JS中难懂的闭包

    来自:一只有趣的程序猿 | 责编:乐乐 链接:jianshu.com/p/2fa4e8a1eaf9 闭包的定义 闭包是指有权访问另一个函数作用域中的变量的函数.(JS高级程序设计) 看到这红宝书上关于 ...

  4. 解决JS中出现的兼容性问题

    1.关于获取行外样式 currentStyle 和 getComputedStyle 出现的兼容性问题 都知道js通过style不可以获取行外样式,当我们需要获取行外样式时: 一般通过这两个方法获取行 ...

  5. 解决JS中0.1+0.2不等于0.3

    console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!= ...

  6. 解决JS中URL中文乱码-解码

    解决url乱码,主要有三种方法:unescape,encodeURI以及encodeURIComponent(),对于url中含有中文的,发现此前用的不起作用,改成了decodeURL中文解码正常,代 ...

  7. 解决js中数字相减为负数的情况

    function loadSumInfo() {   $.get('sumInfo', {         houseBillNo : $('#houseBillNo').val()       }, ...

  8. Js中Promise用法

    promise是用来解决Js中的异步问题的.基本结构如下: function a() {return new Promise((resolve, reject) => {//dosomethin ...

  9. js中三个判断的应用——if else、三元运算符、switch case

    js中三个判断的应用--if else.三元运算符.switch case 区别 if .else if.else 是最常用的判断,可以解决js中的所有的判断需求 三元运算符应用于简单的if else ...

最新文章

  1. 09机器学习实战之多元线性回归
  2. 作业调度框架_Quartz
  3. CF双端总决赛还是LGD总决赛?端游战队挺进决赛,手游已拿三连冠
  4. Getting the right Exception Context from a Memory dump Fixed
  5. 优化网站设计(三):对资源添加缓存控制
  6. Python 核心编程 (全)
  7. pso粒子群优化算法+MATLAB代码
  8. 基于SSM的网上购物商城管理系统
  9. lucene全文检索包括双层PDF
  10. Java Web 后端技术
  11. 编写谷歌浏览器插件入门
  12. Mysql插入JSON串会被去一层转义
  13. 如何快速提升文章阅读量?
  14. web服务器性能测试---服务器性能测试实例
  15. Shiro 实战教程(全)
  16. iOS二维码生成、识别、扫描等
  17. 常用HTTP抓包工具Fiddler使用的12个小技巧,值得收藏!
  18. Ubuntu16.04安装armadillo库
  19. 使用element UI导航菜单默认展开选中子菜单
  20. 虚拟现实项目开发流程

热门文章

  1. 成为一名厉害的程序员,需要哪些必备知识
  2. BurpSuite鱼叉模式爆破
  3. java爬虫gecco的稳定性测试
  4. 深圳国际物流详解:深圳国际物流公司有哪些
  5. 发改委:三家电商正自查整改 厂商退出京东
  6. Java:构造方法总结
  7. 慢查询、慢查询优化、索引失效
  8. c语言程序设计(c99版),c语言程序设计C99版
  9. PyCharm配置GitHub
  10. 利用移动流量领取活动,实现日吸百粉的裂变玩法