闭包就是能够读取其他函数内部变量的函数,因为 JS 中,只有函数内部的子函数才能读取局部变量,因此闭包的本质:就是在一个函数内部创建一个函数,创建的函数可以访问到当前函数的局部变量

1、闭包的特点:

1、函数嵌套函数

2、函数内部可以引用函数外部的参数和变量

3、参数和变量不会被垃圾回收机制回收

2、闭包的用途:

1、通过在外部调用闭包函数,可以在函数外部访问到函数内部的变量

2、使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收

以下是两个代码例子(方便理解)

function fn(){var num = 1;return function(){return num;}
}var fn1 = fn();
console.log(fn1());//1

以上代码中,fn()中的返回值是一个匿名函数,这个函数在fn()作用域中,使用它可以访问到fn()作用域下变量num的值,然后将这个值作为返回值赋给全局变量fn1,这样就实现了在函数外部访问函数内部的变量

function fn(){var num = 1;return function(){var n = 0;console.log(++n);console.log(++num);}
}var fn1 = fn();
fn1();// 1 2
fn1();// 1 3
fn1();// 1 4

以上代码中,fn()中的返回值是一个匿名函数,这个匿名函数被赋给了fn1,因为当一个函数执行结束后,函数和它里面的变量都会被摧毁掉。而匿名函数中访问了fn()里的变量num,所以变量num不会被销毁,而fn1()执行结束后,fn1()和里面的变量n都会被销毁,只剩下变量num留在内存中,这就实现了在函数执行结束后,使变量继续保留在内存中。

3、循环使用闭包解决var定义函数的问题(面试题)

//每隔1s输出一个i
for (var i = 1 ; i <= 5 ; i++) {(function(i){setTimeout(function timer(){console.log(i);},1000*i)})(i)
}
//输出 1 2 3 4 5 //同时输出1 2 3 4 5
for (var i = 1 ; i <= 5 ; i++) {(function(i){setTimeout(function timer(){console.log(i);},1000)})(i)
}
//输出 1 2 3 4 5

4、闭包优点

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

5、闭包缺点

①被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

参考文章:JS中的闭包

JavaScript 闭包理解相关推荐

  1. JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】...

    一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:"闭包是指可以包含自由(未绑定到特定对象)变量的 ...

  2. 我我我我终于理解闭包了,哈哈哈哈(仰天长啸)(JavaScript闭包理解)

    想要理解闭包.首先得了解JavaScript中的三个东西. 1,函数内部可以访问的范围. 就是说,函数内部能访问,自身内部以及自身外层的变量.(这个很好理解,大部分语言都是如此) 如: var a = ...

  3. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  4. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  5. 让你分分钟理解 JavaScript 闭包

    原文:https://www.cnblogs.com/onepixel/p/5062456.html 让你分分钟理解 JavaScript 闭包 闭包,是 Javascript 比较重要的一个概念,对 ...

  6. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...

    全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...

  7. [转载]深入理解JavaScript闭包(closure)

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  8. javascript深入理解js闭包[转]

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  9. javascript深入理解js闭包

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  10. 深入理解Javascript闭包(一)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用于.变量作用域包括 ...

最新文章

  1. matlab编程实现k_means聚类(k均值聚类)
  2. 价值2950亿美元的「量子霸权」,技术水平到了哪个阶段
  3. MOSS Single Sign On Setup Step-By-Step( 转)
  4. Ansible管理节点过多导致的超时问题解决方法
  5. PHP生成验证码图片
  6. gimp教程:gimp界面介绍
  7. java timer schedule_java怎么再次设置Timer的schedule???
  8. python引用传递_python 是值传递还是引用传递 知乎
  9. Java程序员如何提升技能
  10. hibernate框架 最新_2020年最新Java后端学习路线,送给正在入门学习Java的你!
  11. 深度解读最流行的优化算法:梯度下降
  12. 理解 Delphi 的类(十一) - 深入类中的方法[12] - 消息方法
  13. Myeclipse如何使用自带git工具向远程仓库提交代码(转)
  14. mysql修改视图语句alter_MySQL修改视图(ALTER VIEW)
  15. matlab seawater,seawater Matlab seawater工具包 联合开发网 - pudn.com
  16. 电脑键盘灯光的调节方法
  17. pytorch 模型输出特征 保存npy
  18. 网络安全如何做?提防黑客来“敲门”
  19. 中英文颜色对照表(转)
  20. comp3311辅导 assignment1

热门文章

  1. Visual C++ 内存泄露检测工具(VLD)
  2. 新课程背景下高中化学实验室的硬件建设要求
  3. 无线摄像头接有线如何改协议_WiFi中继器——让无线传输更简单
  4. 「干货分享」我所在团队的竞品分析模板--附下载
  5. 如何搭建一对一直播PHP直播系统源码的流程
  6. 重学Java 8新特性 | 第1讲——我们为什么要学习Java 8新特性?
  7. 紧急 抢救mysql 数据库 恢复到指定时间点
  8. knockoutjs
  9. FIR滤波器和IIR滤波器
  10. 解决mescroll固定位置上拉加载无效果?真的只需一步