位置: 编程技术 - 正文

理解javascript函数式编程中的闭包(closure)(javascript的理解)

编辑:rootadmin

推荐整理分享理解javascript函数式编程中的闭包(closure)(javascript的理解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript的function,javascript函数如何定义及其作用,javascript的function,js函数怎么理解,javascript函数如何定义及其作用,javascript的function,javascript的理解,javascript中的函数如何理解,内容如对您有帮助,希望把文章链接给更多的朋友!

闭包(closure)是函数式编程中的概念,出现于 世纪 年代,最早实现闭包的语言是 Scheme,它是 LISP 的一种方言。之后闭包特性被其他语言广泛吸纳。 闭包的严格定义是“由函数(环境)及其封闭的自由变量组成的集合体。”这个定义对于大家来说有些晦涩难懂,所以让我们先通过例子和不那么严格的解释来说明什么是闭包,然后再举例说明一些闭包的经典用途。

什么是闭包

通俗地讲, JavaScript 中每个的函数都是一个闭包,但通常意义上嵌套的函数更能够体 现出闭包的特性,请看下面这个例子:

理解javascript函数式编程中的闭包(closure)(javascript的理解)

这段代码中, generateClosure() 函数中有一个局部变量count, 初值为 0。还有一个叫做 get 的函数, get 将其父作用域,也就是 generateClosure() 函数中的 count 变量增加 1,并返回 count 的值。 generateClosure() 的返回值是 get 函数。在外部我们通过 counter 变量调用了 generateClosure() 函数并获取了它的返回值,也就是 get 函数,接下来反复调用几次 counter(),我们发现每次返回的值都递增了 1。 让我们看看上面的例子有什么特点,按照通常命令式编程思维的理解, count 是generateClosure 函数内部的变量,它的生命周期就是 generateClosure 被调用的时期,当 generateClosure 从调用栈中返回时, count 变量申请的空间也就被释放。问题是,在 generateClosure() 调用结束后, counter() 却引用了“已经释放了的” count变量,而且非但没有出错,反而每次调用 counter() 时还修改并返回了 count。这是怎么回事呢? 这正是所谓闭包的特性。当一个函数返回它内部定义的一个函数时,就产生了一个闭包,闭 包 不 但 包 括 被 返 回 的 函 数 , 还包括这个函数的定义环境。上面例子中,当函数generateClosure() 的内部函数 get 被一个外部变量 counter 引用时, counter 和generateClosure() 的局部变量就是一个闭包。如果还不够清晰,下面这个例子可以帮助 你理解:

上面这个例子解释了闭包是如何产生的:counter1 和 counter2 分别调用了 generateClosure() 函数,生成了两个闭包的实例,它们内部引用的 count 变量分别属于各自的运行环境。我们可以理解为,在generateClosure() 返回 get 函数时,私下将 get 可能引用到的 generateClosure() 函数的内部变量(也就是 count 变量)也返回了,并在内存中生成了一个副本,之后 generateClosure() 返回的函数的两个实例 counter1和 counter2 就是相互独立的了。

闭包的用途

1、嵌套的回调函数 闭包有两个主要用途,一是实现嵌套的回调函数,二是隐藏对象的细节。让我们先看下面这段代码示例,了解嵌套的回调函数。如下代码是在 Node.js 中使用 MongoDB 实现一个简单的增加用户的功能:

如果你对 Node.js 或 MongoDB 不熟悉,没关系,不需要去理解细节,只要看清楚大概的逻辑即可。这段代码中用到了闭包的层层嵌套,每一层的嵌套都是一个回调函数。回调函数不会立即执行,而是等待相应请求处理完后由请求的函数回调。我们可以看到,在嵌套的每一层中都有对 callback 的引用,而且最里层还用到了外层定义的 uid 变量。由于闭包机制的存在,即使外层函数已经执行完毕,其作用域内申请的变量也不会释放,因为里层的函数还有可能引用到这些变量,这样就完美地实现了嵌套的异步回调。

2、实现私有成员 我们知道, JavaScript 的对象没有私有属性,也就是说对象的每一个属性都是曝露给外部的。这样可能会有安全隐患,譬如对象的使用者直接修改了某个属性,导致对象内部数据的一致性受到破坏等。 JavaScript通过约定在所有私有属性前加上下划线(例如_myPrivateProp),表示这个属性是私有的,外部对象不应该直接读写它。但这只是个非正式的约定,假设对象的使用者不这么做,有没有更严格的机制呢?答案是有的,通过闭包可以实现。让我们再看看前面那个例子:

我们可以看到,只有调用 counter() 才能访问到闭包内的 count 变量,并按照规则对其增加1,除此之外决无可能用其他方式找到 count 变量。受到这个简单例子的启发,我们可以把一个对象用闭包封装起来,只返回一个“访问器”的对象,即可实现对细节隐藏。

标签: javascript的理解

本文链接地址:https://www.jiuchutong.com/biancheng/377459.html 转载请保留说明!

上一篇:javascript对象的创建和访问(JavaScript对象的创建)

下一篇:一道关于JavaScript变量作用域的面试题(一道关于医用口罩的数学题初二)

  • 小规模纳税人500万以内免税
  • 什么情况要缴印花税
  • 天然气管道抢维修工作总结
  • 含税金额与不含税金额的换算
  • 税后经营净利率和营业净利率的区别
  • 年报的资产负债率在哪里
  • 未到账的银行存款怎么取
  • 当月开票可以当月缴税吗
  • 小规模公司注销时账务要如何处理
  • 中小企业增值税税率
  • 无形资产特许权使用费怎么做账
  • 当月逾期押金收违约金吗
  • 税率开错的增值税发票怎么办
  • 企业收到待清算的现金
  • 增值税税控盘服务费可以每年都抵扣吗
  • 做季报和月报增发的区别
  • 预提租赁费会计处理
  • 工程项目处理废旧钢材怎么入账的
  • 财务做哪些工作
  • 个税系统怎么查个人申报数据明细
  • a公司转给b公司投资款的会计分录
  • 跨年度残保金退税怎么算
  • 现金收付业务流程图
  • 合同成本如何设一级科目
  • Mac Chrome打开HTTPS证书错误问题解决方法
  • 怎么认定是否为党员
  • 开发票货款未公对公转怎么做账
  • ubuntu系统u盘安装
  • 发工资扣的个人社保计入哪个科目
  • 忘记电脑开机密码怎么打开电脑
  • Win10 19043.1237 9月累积更新 KB5005565推送(附更新修复+下载)
  • 业务招待费应计入期间费用的哪项费用
  • vue实现导出
  • sonar-scanner需要配置环境变量
  • php zmq
  • 油猴脚本插件官网
  • laravel php
  • 垃圾清运费属于什么服务
  • yolov5添加注意力机制真的有用吗?
  • 能用javascript 最终
  • vue请求后端接口
  • flash中文版
  • 填写发票票种核实怎么填
  • 国家税务局监制的票还能用吗
  • 2201应付职工薪酬
  • 配送中心适合哪种类型的企业
  • 如何用python给excel每一行添加序号
  • 预缴增值税附加税
  • 不得从销项中抵扣的进项有哪些
  • 预收账款的会计要素
  • 低值易耗品包括哪些
  • sql server 实现数据值加一减一
  • sql server 2008 r2教程
  • 小企业长期债券投资交易费用
  • 融资租赁业务的账务及涉税处理
  • 应收账款余额要包含应收票据吗
  • 交租金没有发票怎么办
  • 财政补贴的政策
  • 汇算清缴怎么申报
  • 单位要处置一辆车怎么办
  • 汇算清缴要补交0.01怎么调成0
  • 企业对外购和自己的区别
  • 本年利润怎么结账
  • windows勒索病毒溯源
  • 有效减少win8关机时间的方法分享
  • 一岁的宝宝可以喝枸杞水吗
  • linux安装.gz
  • ghoststartservice.exe是什么进程 有什么作用 ghoststartservice进程查询
  • windows疑难解答在哪里
  • win7系统笔记本怎么调节电脑亮度
  • WIN7系统如何关掉游戏屏保
  • Cocos2dx3.2 Crazy Tetris 绘制不规则方块 遮罩(ClippingNode的使用)
  • linux一共多少命令
  • jquery.form.js下载
  • javascript核心技术开发解密
  • 如何查询发票代码和发票号码
  • 高速通行费发票查验
  • 马尼拉清关HS几位
  • 国家税务总局对税务助征员
  • 金三是什么鱼竿?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设