参考博客:http://www.cnblogs.com/cxying93/p/6103375.html

闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。

1、变量作用域

要理解闭包,首先要理解javascript的特殊的变量作用域。

变量的作用域无非就两种:全局变量和局部变量。

javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

注意点:在函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明的是一个全局变量!

2、如何从外部读取函数内部的局部变量?

出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现。

那就是在函数内部,再定义一个函数。

function f1(){

    var n=999;

    function f2(){
      alert(n); // 999
    }

  }

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。

这就是Javascript语言特有的"链式作用域"结构(chain scope),

子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

3、闭包的概念

上面代码中的f2函数,就是闭包。

各种专业文献的闭包定义都非常抽象,我的理解是: 闭包就是能够读取其他函数内部变量的函数。

由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数“。

所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

 4、闭包的用途

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

5、闭包的优点

(1)逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。

(2)方便调用上下文的局部变量。

(3)加强封装性,是第2点的延伸,可以达到对变量的保护作用。

6、使用闭包的注意点(缺点)

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

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

7、闭包的特性

(1)作为函数变量的一个引用。当函数返回时,其处于激活状态。

(2)闭包就是当一个函数返回时,并没有释放资源的栈区。

8、闭包对页面的影响

通过使用闭包,我们可以做很多事情。比如模拟面向对象的代码风格;更优雅、更简洁的表达出代码;在某些方面提升代码的执行效率。

9、闭包的工作原理

因为闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。多个函数可以使用同一个环境,这使得他们可以通过改变那个环境相互交流。

10、使用场景

(1)采用函数引用方式的setTimeout调用。 例子

(2)将函数关联到对象的实例方法。

(3)封装相关的功能集。

了解了什么是闭包后,下面我们来练练手吧~

相关知识:

什么调用函数的几种方法?什么是函数引用方法?

什么是闭包?闭包的工作原理、优缺点、使用场景和对页面的影响相关推荐

  1. Django基础(33): 中间件(middleware)的工作原理和应用场景举例

    在初级Django开发项目中,你大概率用不到中间件(Middleware).但随着项目需求越来越复杂,你就需要开始编写自己的中间件了.当你了解到Django中间件(middleware)的工作原理和作 ...

  2. Django 中间件(middleware)的工作原理和应用场景举例

    在初级Django开发项目中,你大概率用不到中间件(Middleware).但随着项目需求越来越复杂,你就需要开始编写自己的中间件了.当你了解到Django中间件(middleware)的工作原理和作 ...

  3. OCR的工作原理与应用场景

    OCR 光学符号识别 光学符号识别,即OCR (Optical Character Recognition),是计算机视觉领域的一个重要分支,主要用于将图像中的文本转换为机器可读的形式.20世纪90年 ...

  4. 浏览器工作原理:从 URL 输入到页面展现到底发生了什么?

    转载自简书:https://www.jianshu.com/p/d616d887953a,仅做记录分享,侵删 对浏览器原理有过了解的一定不会陌生这篇神文<How Browsers Work> ...

  5. 闭包的定义,原理,应用场景,优点,缺点

    目录 一.闭包定义 二.闭包的特点 三.闭包原理 四.闭包的应用场景. 五.闭包的优点和缺点 一.闭包定义 函数执行后返回的结果是一个内部函数,并被外部变量所引用,如果内部函数持有被执行函数作用域的变 ...

  6. 数据采集:Flume和Logstash的工作原理和应用场景

    在某个Logstash的场景下,我产生了为什么不能用Flume代替Logstash的疑问,因此查阅了不少材料在这里总结,大部分都是前人的工作经验下,加了一些我自己的思考在里面,希望对大家有帮助. 大数 ...

  7. 苹果手机速度慢_科普垃圾清理软件的工作原理 它们会对手机产生怎样的影响?...

    [视频版] #猛戳下方视频围观#▼ 魅族将发布世界上第一款无孔手机?  路人盲摸vivo"水滴新机" 无按键插孔  去除启动页广告秒开APP& 告别软件弹窗烦恼  [图文版 ...

  8. 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景

    Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...

  9. CDN工作过程及工作原理

    CDN(Content Delivery Network)即内容分发网络,CDN的作用是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度.本文介绍CDN的工作 ...

最新文章

  1. 用 MySQL 实现分布式锁,你听过吗?
  2. dubbo之注册管理中心
  3. python3.7.2教程-centos7系统下python2与python3共存
  4. python中 __name__及__main()__的妙处
  5. 机器学习实战(四)——基于概率论的分类方法:朴素贝叶斯
  6. Windows7部署WordPress傻瓜式教程-cnblogs
  7. C++/C--内存的四驱模型
  8. 如何在自己的程序里执行/终止一个外部程序?
  9. 在Spring环境下存取properties文件中的数值
  10. 李践《高效人士的五项管理-行动日志》 表格
  11. python寻峰,寻找峰值
  12. RINEX观测值文件读取(O文件)
  13. 流体力学专业常用网站集合
  14. 568A和568B的线序
  15. 【游戏开发实战】Unity实现水果忍者切水果的刀痕效果教程(两种实现方式:TrailRenderer、LineRenderer)
  16. 监控系统-Prometheus(普罗米修斯)(三)Grafana可视化图形工具
  17. SAP License:SAP软件作用是什么
  18. Simulink学习笔记
  19. 那些年啊,那些事——一个程序员的奋斗史 ——98
  20. oracle备份数据表叫什么,oracle备份表和数据

热门文章

  1. win10搜索框突然不能搜索本地应用
  2. DM8达梦数据库数据文件整体迁移方式
  3. 美国青年以车会友 愿做两国交流的使者
  4. 问题生成(QG)与答案生成(QA)
  5. ubuntu装软件包
  6. linux vi 剪切板,让Vim支持在终端剪贴板共享
  7. python写词法分析器_如何用python写一个简单的词法分析器
  8. 泡泡堂段王一进去服务器不稳定,3月22日泡泡新段王 《泡泡堂》段位系统大革新...
  9. 2021年11月30日
  10. 美的不可控温小烤箱 MT10AH-AA 烤箱简易改造——15块钱增加控温系统