位置: 编程技术 - 正文

Javascript的闭包详解(js中闭包)

编辑:rootadmin

推荐整理分享Javascript的闭包详解(js中闭包),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js闭包的定义和用途,javascript闭包详解,javascript闭包例子,javascript中的闭包,javascript闭包详解,javascript闭包运行原理,js闭包的定义和用途,js闭包的定义和用途,内容如对您有帮助,希望把文章链接给更多的朋友!

前言:还是一篇入门文章。Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。

注:本文是入门文章,例子素材整理于网络,如果你是高手,欢迎针对文章提出技术性建议和意见。本文讨论的是Javascript,不想做语言对比,如果您对Javascript天生不适,请自行绕道。

什么是闭包闭包是什么&#;闭包是Closure,这是静态语言所不具有的一个新特性。但是闭包也不是什么复杂到不可理解的东西,简而言之,闭包就是:

闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配当在一个函数内定义另外一个函数就会产生闭包上面的第二定义是第一个补充说明,抽取第一个定义的主谓宾——闭包是函数的‘局部变量'集合。只是这个局部变量是可以在函数返回后被访问。(这个不是官方定义,但是这个定义应该更有利于你理解闭包)

做为局部变量都可以被函数内的代码访问,这个和静态语言是没有差别。闭包的差别在于局部变变量可以在函数执行结束后仍然被函数外的代码访问。这意味 着函数必须返回一个指向闭包的“引用”,或将这个”引用”赋值给某个外部变量,才能保证闭包中局部变量被外部代码访问。当然包含这个引用的实体应该是一个 对象,因为在Javascript中除了基本类型剩下的就都是对象了。可惜的是,ECMAScript并没有提供相关的成员和方法来访问闭包中的局部变 量。但是在ECMAScript中,函数对象中定义的内部函数(inner function)是可以直接访问外部函数的局部变量,通过这种机制,我们就可以以如下的方式完成对闭包的访问了。

上述代码的执行结果是:Hello Closure,因为sayHello()函数在greeting函数执行完毕后,仍然可以访问到了定义在其之内的局部变量text。

好了,这个就是传说中闭包的效果,闭包在Javascript中有多种应用场景和模式,比如Singleton,Power Constructor等这些Javascript模式都离不开对闭包的使用。

ECMAScript闭包模型ECMAScript到底是如何实现闭包的呢?想深入了解的亲们可以获取ECMAScript 规范进行研究,我这里也只做一个简单的讲解,内容也是来自于网络。

在ECMAscript的脚本的函数运行时,每个函数关联都有一个执行上下文场景(Execution Context) ,这个执行上下文场景中包含三个部分

文法环境(The LexicalEnvironment)变量环境(The VariableEnvironment)this绑定其中第三点this绑定与闭包无关,不在本文中讨论。文法环境中用于解析函数执行过程使用到的变量标识符。我们可以将文法环境想象成一个对象,该对 象包含了两个重要组件,环境记录(Enviroment Recode),和外部引用(指针)。环境记录包含包含了函数内部声明的局部变量和参数变量,外部引用指向了外部函数对象的上下文执行场景。全局的上下文 场景中此引用值为NULL。这样的数据结构就构成了一个单向的链表,每个引用都指向外层的上下文场景。

例如上面我们例子的闭包模型应该是这样,sayHello函数在最下层,上层是函数greeting,最外层是全局场景。如下图: 因此当sayHello被调用的时候,sayHello会通过上下文场景找到局部变量text的值,因此在屏幕的对话框中显示出”Hello Closure” 变量环境(The VariableEnvironment)和文法环境的作用基本相似,具体的区别请参看ECMAScript的规范文档。

闭包的样列前面的我大致了解了Javascript闭包是什么,闭包在Javascript是怎么实现的。下面我们通过针对一些例子来帮助大家更加深入的理解闭包,下面共有5个样例,例子来自于JavaScript Closures For Dummies(镜像)。 例子1:闭包中局部变量是引用而非拷贝

Javascript的闭包详解(js中闭包)

因此执行结果应该弹出的而非。

例子2:多个函数绑定同一个闭包,因为他们定义在同一个函数内。

例子3:当在一个循环中赋值函数时,这些函数将绑定同样的闭包

testList的执行结果是弹出item3 undefined窗口三次,因为这三个函数绑定了同一个闭包,而且item的值为最后计算的结果,但是当i跳出循环时i值为4,所以list[4]的结果为undefined.

例子4:外部函数所有局部变量都在闭包内,即使这个变量声明在内部函数定义之后。

执行结果是弹出”Hello Alice”的窗口。即使局部变量声明在函数sayAlert之后,局部变量仍然可以被访问到。

例子5:每次函数调用的时候创建一个新的闭包

闭包的应用Singleton 单件:

这个单件通过闭包来实现。通过闭包完成了私有的成员和方法的封装。匿名主函数返回一个对象。对象包含了两个方法,方法1可以方法私有变量,方法2访 问内部私有函数。需要注意的地方是匿名主函数结束的地方的'()',如果没有这个'()'就不能产生单件。因为匿名函数只能返回了唯一的对象,而且不能被 其他地方调用。这个就是利用闭包产生单件的方法。

浅谈JavaScript实现面向对象中的类 对象,是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。--

浅谈JavaScript函数节流 浏览器中某些计算和处理要比其他的昂贵的多。例如,DOM操作比起非DOM交互需要更多的内存和CPU时间。连续尝试进行过多的DOM相关操作可能会导致浏览

WEB前端设计师常用工具集锦 下面是我整理和收集的一些前端开发常用的插件、工具、软件等不为别的,相当于给电脑做个小备份,至于使用方法,以后我会总结,目前的话还是自

标签: js中闭包

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

上一篇:Javascript中的五种数据类型详解(javascript组成)

下一篇:浅谈JavaScript实现面向对象中的类(简述javascript)

  • 进口环节消费税需要自行申报吗
  • 怎么计提固定资产折旧科目
  • 增值税普通
  • 软件产品增值税超税负即征即退
  • 购买的固定资产什么时候折旧
  • 股东借钱给公司,公司经营不善倒闭!借款公司要还不
  • 普通发票作废要本人去拿吗
  • 自制原始凭证和原始凭证的区别
  • 住宿费专票可以报销吗
  • 人力资源公司劳务派遣怎么收费
  • 招待费进项税如何抵扣
  • 财产转让所得税计算方法
  • 京东电子商务平台业务流程
  • 非基本人员单位部分
  • 火车票抵扣进项税额怎么申报
  • 物业营改增什么时候开始
  • 税务总局关于四流一致解答
  • 去年的发票今年能红字冲销吗
  • 金税盘红字信息表金额大于原蓝票
  • 推广服务费收入如何核算成本
  • 老板垫付的钱应该怎么做科目
  • 非应纳增值税项目
  • 建筑业 分包
  • 购买电子承兑差额怎么算
  • uefiu盘安装系统步骤win10
  • Win10 (21H1)Build 19043.1266更新补丁KB5005611正式版发布:附修复更新内容
  • linux录制视频工具
  • 息税前利润和税前净利润的关系
  • 数据持久化操作
  • 生产型企业出口外购货物可以退税吗
  • php发送短信
  • 施工企业会计核算特点有哪些
  • 公司企业名称变更,银行账号会变吗
  • 应交税费已交税金是什么意思
  • 发票密码区如何调整
  • 新版python
  • 电商后台管理系统简介
  • php的运算符主要包括哪些?
  • 没有开发票的收入
  • mongodb部署安装
  • 应交增值税如何计算,如何进行会计处理
  • 企业所得税的扣除是什么意思
  • sql server2005备份
  • 1元换购的商品是正品吗
  • 暂估入库成本的会计分录
  • 私立幼儿园规模标准
  • 购买的税控设备
  • 固定资产的折旧标准
  • 股东投资款是否要缴税
  • 公司办理网银
  • 年度纳税总额包括个税吗
  • 小规模其他业务收入交多少税率
  • mysql备份与恢复数据库
  • win8下载软件
  • centos 安装
  • win7系统cpu占用率过高怎么办
  • win8打开运行窗口
  • win10系统遇到错误
  • wondows文件保护
  • win7盘符不见了
  • SWNETSUP.EXE - SWNETSUP是什么进程 有什么用
  • windowsxp复制粘贴不可用?
  • linux系统怎么安装wine
  • win10电脑无法上网
  • linux必学的60个命令及使用
  • win7系统垃圾手动清理
  • linux shell脚本命令
  • jsoncpp rapidjson
  • jquery绑定onchange
  • perl vs python
  • python批量修改文本内容
  • python嵌套列表怎么遍历
  • 定额发票查询app
  • 水利建设基金如何计提
  • 江苏省电子税务局社保缴费查询
  • 个人账户手机银行如何对公转账
  • 河南林州在哪三省交界处
  • 价税分离计算公式
  • 营业执照增加项目怎么办理
  • 江苏税务局网上预缴税流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设