一.闭包的简介:

闭包就是能够读取其他函数内部变量的函数。只有函数内部的子函数才能读取局部变量,在本质上,闭包是函数内部和函数外部连接起来的桥梁。

二.如何产生闭包:

当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包也可以说内部函数引用了外部函数的数据(变量/函数)

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

三.闭包的作用:

1.   使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)

2.   让函数外部可以操作(读写)到函数内部的数据(变量/函数)

四:闭包的生命周期:

产生:在嵌套内部函数定义执行完时就产生了(不是在调用)

死亡:在嵌套的内部函数成为垃圾对象时

五:闭包的应用:

1.   为节点循环绑定click事件,在事件函数中使用当次循环的值或节点,而不是最后一次循环的值或节点

   <body><ul><li>1</li><li>2</li><li>3</li></ul><script>var li = document.getElementsByTagName("li");for (var i = 0; i < li.length; i++) {(function (i) {li[i].onclick = function () {console.log(li[i].innerText);};})(i);}</script></body>

2. 将函数作为另一个函数的返回值

  function fn1() {var a = 2function fn2() {a++console.log(a)}return fn2}var f = fn1()f() // 3f() // 4

3. 将函数作为实参传递给另一个函数调用

  function fun(msg, time) {setTimeout(function () {alert(msg)}, time)}fun('haha', 2000)

4.(1)编写一个js文件,将功能封装在闭包中,对外提供公共访问方法 (自定义js模块)

//js文件
function myModule() {//私有数据var msg = 'My school'//操作数据的函数function doSomething() {console.log('doSomething() '+msg.toUpperCase())}function doOtherthing () {console.log('doOtherthing() '+msg.toLowerCase())}//向外暴露对象(给外部使用的方法)return {doSomething: doSomething,doOtherthing: doOtherthing}
}//引入
<body>
<script type="text/javascript" src="myModule.js"></script>
<script type="text/javascript">var module = myModule()module.doSomething()module.doOtherthing()
</script>
</body>

(2) 使用window对外提供访问方法

//js文件
(function () {//私有数据var msg = 'My school'//操作数据的函数function doSomething() {console.log('doSomething() '+msg.toUpperCase())}function doOtherthing () {console.log('doOtherthing() '+msg.toLowerCase())}//向外暴露对象(给外部使用的方法)window.myModule2 = {doSomething: doSomething,doOtherthing: doOtherthing}
})()//引入<body>
<script type="text/javascript" src="myModule2.js"></script>
<script type="text/javascript">myModule2.doSomething()myModule2.doOtherthing()
</script>
</body>

六:闭包的缺点及解决:

缺点:函数执行完后,函数的局部变量没有释放,占用内存时间会变长,容易产生内存泄漏

解决:及时释放

      function fn1() {var arr = new Array(999999);function fn2() {console.log(arr.length);}return fn2;}var f = fn1(); //因函数fn2被f引用,所以fn2不会被回收f();f = null;//让内部函数成为垃圾对象,回收闭包,及时释放

js两大神兽之“闭包“相关推荐

  1. 【JavaScript高级05】JavaScript第二大神兽:闭包

    1,闭包引入 编写以下代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=& ...

  2. 闭包的两大作用:保存/保护

    闭包的概念 函数执行时形成的私有上下文EC(FN),正常情况下,代码执行完会出栈后释放;但是特殊情况下,如果当前私有上下文中的某个东西被上下文以外的事物占用了,则上下文不会出栈释  放, 从而形成不销 ...

  3. js中的数据类型分为两大类分别是什么_数据类型有这么重要吗?

    一个没有得到重视的知识点, 数据类型 每种语言都有自己的数据类型,下面以javascript为例 类型的分类 js的数据类型可以分为 两大类: 1,值类型 (String,Number,undefin ...

  4. JavaScript两大支柱-PART1:如何逃脱第七层地狱

    阅读原文 在我们进入这个主题之前,请允许我先介绍一下我自己.我想在这结束之前,你可能会想知道我是谁. 我是Eric Elliott,<Programming JavaScript Applica ...

  5. 8 - 9 template两大功能 : simple_tag、模板继承

    2019独角兽企业重金招聘Python工程师标准>>> template 两大功能 一些基本语法 比如 if for jquery引入 修改时间格式 模板继承 我们在生产中会发现写的 ...

  6. 中国移动开发者社区专访:学习Android的两大法宝

    本文为原创,如需转载,请注明作者和出处,谢谢! 近日,接受了中国移动开发者社区的专访,谈了关于Android的一系列问题 http://dev.10086.cn/upload/developers_m ...

  7. 大文件分片上传前端框架_基于Node.js的大文件分片上传

    基于Node.js的大文件分片上传 我们在做文件上传的时候,如果文件过大,可能会导致请求超时的情况.所以,在遇到需要对大文件进行上传的时候,就需要对文件进行分片上传的操作.同时如果文件过大,在网络不佳 ...

  8. “前端+应用”两大监控利器商业化首发 ARMS领跑APM市场

    摘要: 日前,阿里巴巴中间件(Aliware)旗下产品业务实时监控服务ARMS正式商用.首发商用的ARMS目前涵盖应用监控和前端监控两大功能.由此,ARMS的商业化正式填补了阿里云在APM(Appli ...

  9. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南

    js执行环境作用域和闭包 It may seem surprising, but in my opinion the most important and fundamental concept to ...

最新文章

  1. 腾讯联姻开心网意欲何为
  2. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义填充色)实战(dot plot)
  3. CTFshow 命令执行 web76
  4. laravel 检测sql_在Laravel PHP应用程序中轻松进行面部检测
  5. c语言 将点同时保证x坐标从小到大,y坐标从小到大地排序,C语言程序设计实验报告(二)...
  6. 从零开始,CentOS6安装ghost博客
  7. QLineEdit用正则表达式限制double类型输入,double转为9位小数的字符串
  8. linux从字符界面转入图形界面一法
  9. 2022年创业项目排行榜前十名,这些你都不知道就别想赚钱了
  10. 我能取得成就的原因和不足之处
  11. 如何把小米和计算机共享,小米随身Wifi如何让手机共享电脑文件 小米wifi共享电脑文件教程...
  12. 笔记本电脑更换固态硬盘教程(联想ThinkPadE455)
  13. linux下挂载光驱方法,Linux下光驱挂载技巧
  14. java计算机毕业设计技术的游戏交易平台源代码+数据库+系统+lw文档
  15. python绘制图形沙漏_sandglass(沙漏)——一个让人解脱的python时间处理库
  16. http://blog.csdn.net/rambo2188/article/details/6998349
  17. 一篇文章彻底清楚shellcode(精品)
  18. 字符串copy函数技术推演
  19. 榛果 美团 登录 爬虫 requests session
  20. 基于ENVI-GLT方法的风云三号D微波成像仪(FY3-D-MWRI)传感器的卫星影像的下载和几何校正

热门文章

  1. 学生网上考试报名系统的设计与实现
  2. unity使用steamVR插件导出游戏头显无反应问题
  3. 表格计算机考试基础知识及重点试题,人社厅计算机考试题库-计算机等级考试一级的资料今年大一期末考试会考相关的试题请问大家有 爱问知识人...
  4. Oracle语句的执行顺序
  5. 什么是云计算?云计算学习方向有哪些?
  6. 小程序 - 五星评价系统(状态支持满星点亮 半星点亮 不点亮)
  7. 重磅发布 | 中汽协携手零数科技发布汽车数据可信存证区块链平台
  8. MySQL8超详细安装教程
  9. uniapp怎么调起摄像头拍视频_uni-app实现图片和视频上传功能
  10. 混凝土搅拌站计算机控制系统,一种混凝土搅拌站自动控制系统