什么是闭包?闭包的工作原理、优缺点、使用场景和对页面的影响
参考博客: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)封装相关的功能集。
了解了什么是闭包后,下面我们来练练手吧~
相关知识:
什么调用函数的几种方法?什么是函数引用方法?
什么是闭包?闭包的工作原理、优缺点、使用场景和对页面的影响相关推荐
- Django基础(33): 中间件(middleware)的工作原理和应用场景举例
在初级Django开发项目中,你大概率用不到中间件(Middleware).但随着项目需求越来越复杂,你就需要开始编写自己的中间件了.当你了解到Django中间件(middleware)的工作原理和作 ...
- Django 中间件(middleware)的工作原理和应用场景举例
在初级Django开发项目中,你大概率用不到中间件(Middleware).但随着项目需求越来越复杂,你就需要开始编写自己的中间件了.当你了解到Django中间件(middleware)的工作原理和作 ...
- OCR的工作原理与应用场景
OCR 光学符号识别 光学符号识别,即OCR (Optical Character Recognition),是计算机视觉领域的一个重要分支,主要用于将图像中的文本转换为机器可读的形式.20世纪90年 ...
- 浏览器工作原理:从 URL 输入到页面展现到底发生了什么?
转载自简书:https://www.jianshu.com/p/d616d887953a,仅做记录分享,侵删 对浏览器原理有过了解的一定不会陌生这篇神文<How Browsers Work> ...
- 闭包的定义,原理,应用场景,优点,缺点
目录 一.闭包定义 二.闭包的特点 三.闭包原理 四.闭包的应用场景. 五.闭包的优点和缺点 一.闭包定义 函数执行后返回的结果是一个内部函数,并被外部变量所引用,如果内部函数持有被执行函数作用域的变 ...
- 数据采集:Flume和Logstash的工作原理和应用场景
在某个Logstash的场景下,我产生了为什么不能用Flume代替Logstash的疑问,因此查阅了不少材料在这里总结,大部分都是前人的工作经验下,加了一些我自己的思考在里面,希望对大家有帮助. 大数 ...
- 苹果手机速度慢_科普垃圾清理软件的工作原理 它们会对手机产生怎样的影响?...
[视频版] #猛戳下方视频围观#▼ 魅族将发布世界上第一款无孔手机? 路人盲摸vivo"水滴新机" 无按键插孔 去除启动页广告秒开APP& 告别软件弹窗烦恼 [图文版 ...
- 多线程读取同一个文件_前端进阶:多线程Web Workers的工作原理及使用场景
Web Worker 概述 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行.在主线程运行的同时,Worker ...
- CDN工作过程及工作原理
CDN(Content Delivery Network)即内容分发网络,CDN的作用是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度.本文介绍CDN的工作 ...
最新文章
- 用 MySQL 实现分布式锁,你听过吗?
- dubbo之注册管理中心
- python3.7.2教程-centos7系统下python2与python3共存
- python中 __name__及__main()__的妙处
- 机器学习实战(四)——基于概率论的分类方法:朴素贝叶斯
- Windows7部署WordPress傻瓜式教程-cnblogs
- C++/C--内存的四驱模型
- 如何在自己的程序里执行/终止一个外部程序?
- 在Spring环境下存取properties文件中的数值
- 李践《高效人士的五项管理-行动日志》 表格
- python寻峰,寻找峰值
- RINEX观测值文件读取(O文件)
- 流体力学专业常用网站集合
- 568A和568B的线序
- 【游戏开发实战】Unity实现水果忍者切水果的刀痕效果教程(两种实现方式:TrailRenderer、LineRenderer)
- 监控系统-Prometheus(普罗米修斯)(三)Grafana可视化图形工具
- SAP License:SAP软件作用是什么
- Simulink学习笔记
- 那些年啊,那些事——一个程序员的奋斗史 ——98
- oracle备份数据表叫什么,oracle备份表和数据
热门文章
- win10搜索框突然不能搜索本地应用
- DM8达梦数据库数据文件整体迁移方式
- 美国青年以车会友 愿做两国交流的使者
- 问题生成(QG)与答案生成(QA)
- ubuntu装软件包
- linux vi 剪切板,让Vim支持在终端剪贴板共享
- python写词法分析器_如何用python写一个简单的词法分析器
- 泡泡堂段王一进去服务器不稳定,3月22日泡泡新段王 《泡泡堂》段位系统大革新...
- 2021年11月30日
- 美的不可控温小烤箱 MT10AH-AA 烤箱简易改造——15块钱增加控温系统