闭包就是一个函数能够访问其函数外部作用域中的变量,即在外面可以调用函数中的函数的变量,其实他就是将函数内外部连接起来的桥梁
闭包三大特点:
  1. 函数嵌套函数
  2. 内部函数可以访问外部函数的变量
  3. 参数和变量不会被回收
对于初学者比较难理解,可以通过以下两句话来加深理解:
  1、闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这
    个函数的局部变量。闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
  2、不必纠结到底怎样才算闭包,其实你写的每一个函数都算作闭包,即使是全局函数,你访问函数外部的全局变量时,就是闭包的体现。

这里举个例子,观察以下代码:

function a(){var i = 10; function b(){alert(i);}  return b;
}var c = a();c();

这段代码有以下两个特点:

1、函数b嵌套在函数a内部;2、函数a返回函数b;

引用关系如下:

  

这样在执行完var c = a()后,变量c实际上是指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:

当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。

当函数b执行的时候亦会像以上步骤一样。因此,执行时b的作用域链包含了3个对象:b的活动对象、a的活动对象和window对象,如下图所示:

如图所示,当在函数b中访问一个变量的时候,搜索顺序是:

  1.    先搜索自身的活动对象,如果存在则返回,如果不存在将继续搜索函数a的活动对象,依次查找,直到找到为止。

  2.    如果函数b存在prototype原型对象,则在查找完自身的活动对象后先查找自身的原型对象,再继续查找。这就是Javascript中的变量查找机制。

  3.    如果整个作用域链上都无法找到,则返回undefined。

闭包的用途

    1. 闭包可以读取函数内部变量    2. 将函数内部变量的值始终保存在内存中

使用闭包的注意点

    1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值


转载于:https://www.cnblogs.com/menglong1214/p/9160583.html

JavaScript闭包函数的理解相关推荐

  1. JavaScript闭包函数的理解与使用

    要理解闭包,首先理解javascript特殊的变量作用域,变量的作用域无非就是两种: 全局变量 局部变量 javascript语言的特殊处就是函数内部可以读取全局变量. 1.如何从外部读取局部变量 我 ...

  2. javascript匿名函数的理解

    复制粘贴 [color=red]点评:请记住,关键点是理解javascript的函数概念(参考w3cshool对函数的描述,搜索关键字:ECMAScript 函数).以及()的运算的理解. 比如:va ...

  3. JavaScript闭包函数与闭包释放

    作用域链:一般,变量取值是到创建这个变量的函数的作用域中取值,如果没有查到,就会往上查找,直到找到全局作用域,这个查找的形成为作用域链. Javascript闭包函数:闭包就是能够读取其它函数内部变量 ...

  4. JavaScript闭包函数

    JavaScript闭包函数 1 概述 2 词法作用域 3 闭包 1 概述 一个函数和对其周围状态(词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure).也就是说, ...

  5. JavaScript闭包函数理解

    JavaScript闭包 一.变量的作用域: 要理解闭包,首先必须理解JavaScript特殊的变量作用域.      变量作用域无非就是两种:全局变量 和 局部变量.       JavaScrip ...

  6. javascript 匿名函数的理解

    代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他 ...

  7. 对JAVASCRIPT匿名函数的理解

    网上很多解释,我无法理解,我想知道原理...这篇文章应该可以透彻一点 Query片段: view plaincopy to clipboardprint? (function(){ //这里忽略jQu ...

  8. 对javascript匿名函数的理解(透彻版)

    Query片段: view plain copy to clipboard print ? (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我 ...

  9. JavaScript闭包函数详解

    目录 闭包函数 变量作用域 闭包的概念 闭包的用途 闭包的缺点 闭包函数 变量作用域 要理解JavaScript闭包,就要先理解JavaScript的变量作用域. 变量的作用域有两种:全局的和局部的( ...

  10. JavaScript闭包的个人理解

    闭包指的就是内部函数可以访问外部函数的作用域,也就是通过一个函数的子函数来访问这个函数作用域下的变量. 我们可以看一下下面的函数 function Closure() {var number = 99 ...

最新文章

  1. 最新3D目标检测文章汇总(包含ECCV20和ACMMM20)
  2. 深入JVM——OOM异常解析
  3. Linux 线程(1):线程概述
  4. 记录一种多个按钮中每次只能选中一个的实现方式
  5. python做一个考试系统_Python在线考试系统防作弊功能的思路和实现
  6. Spring Boot学习总结(6)——SpringBoot解决ajax跨域请求问题的配置
  7. 【Java】equals源码分析
  8. Linux无盘工作站
  9. 服务器的mp4文件是黑屏,Windows7的Windows media player 播放由影音制作生成的Mp4视频,出现黑屏、重启动...
  10. 【扫盲系列】网络术语
  11. 定期删除IIS日志文件
  12. 5ic计算机考试考卷读取错误,北京自考出现错误试卷
  13. 利用pyboardCN V2播放Bad apple
  14. Justinmind使用教程(3)——管理原型
  15. linux安装mongodb,实测好用
  16. C7N新增,保存,删除基础模板
  17. 正海转债,寿22转债,东材转债上市价格预测
  18. VS2017下解决:error LNK2019: 无法解析的外部符号 __iob_func
  19. C语言直接驱动硬件实现PC机的串口操作
  20. XHR level2的新功能

热门文章

  1. 你真的要收下这份大礼包!!
  2. 创业宝典:未来企业家之路(第5版)
  3. Python获取网络中的存活主机以及哪些主机是Linux
  4. webpack4打包vue前端多页面项目
  5. Diagnostics: File file:/tmp/spark-***/__spark_libs__***.zip does not exist
  6. Junit4与junt3并存时产生的问题
  7. android动画的实现过程
  8. HttpModule和HttpHandler的常见用法
  9. MapXtreme 2005 学习心得 将wor格式转wms格式(十)
  10. Linux常用基本命令及应用技巧1