位置: 编程技术 - 正文

全面理解JavaScript中的闭包(全面理解全面把握全面落实)

编辑:rootadmin

推荐整理分享全面理解JavaScript中的闭包(全面理解全面把握全面落实),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:全面理解中国式现代化的本质要求,全面理解和准确把握新时代党的建设总要求心得体会,全面理解javascript,全面理解中国式现代化的本质要求,全面理解和把握新发展理念,全面理解全面把握全面落实,全面理解全面把握全面落实,全面理解和准确把握关于作风建设的重要精神心得体会,内容如对您有帮助,希望把文章链接给更多的朋友!

引子

闭包是有权访问另一个函数作用域中的变量的函数。闭包是javascript中很难理解的部分,很多高级的应用都依靠闭包来实现的,我们先来看下面的一个例子:

上面代码,根据变量的作用域,函数outer中所有的局部变量,对函数inner都是可见的;函数inner中的局部变量,在函数inner外是不可见的,所以在函数inner外是无法读取函数inner的局部变量的。

既然函数inner可以读取函数outer的局部变量,那么只要将inner作为返会值,就可以直接在ouer外部读取inner的局部变量。

这个函数有两个特点:

函数inner嵌套在函数ouer内部; 函数outer返回函数inner。

这样执行完var rs = outer()后,实际rs指向了函数inner。这段代码其实就是一个闭包。也就是说当函数outer内的函数inner被函数outer外的一个变量引用的时候,就创建了一个闭包。

作用域简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

全局作用域

以上三个对象num1,num2和fun1均是全局作用域,这里要注意的是末定义直接赋值的变量自动声明为拥有全局作用域;

局部作用域

作用域链Javascript中一切皆对象,这些对象有一个[[Scope]]属性,该属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链(Scope Chain),它决定了哪些数据能被函数访问。

当函数创建的时候,它的[[scope]]属性自动添加好全局作用域

当函数调用的时候,会创建一个称为运行期上下文(execution context)的内部对象,z这个对象定义了函数执行时的环境。它也有自己的作用域链,用于标识符解析,而它的作用域链初始化为当前运行函数的[[Scope]]所包含的对象。

在函数执行过程中,每遇到一个变量,都会经历一次标识符解析过程以决定从哪里获取和存储数据。该过程从作用域链头部,也就是从活动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没找到继续搜索作用域链中的下一个对象,如果搜索完所有对象(最后一个为全局对象)都未找到,则认为该标识符未定义。

闭包闭包简单来说就是一个函数访问了它的外部变量。

status保存在quo中,它返回了一个对象,这个对象里的方法getStatus引用了这个status变量,即getStatus函数访问它的外部变量status;

假如并没有getStatus这个方法,那么quo('sting')结束后,status自动被回收,正是因为返回的匿名对象被一个全局对象引用,那么这个匿名对象又依赖于status,所以会阻止status的释放。

例子:

全面理解JavaScript中的闭包(全面理解全面把握全面落实)

匿名函数创建了一个闭包,那么其访问的i是外部test函数中的i,所以每一个节点实际上引用的是同一个i。

每一个节点绑定了一个事件,这个事件接收一个参数,并且立即运行,传入i,因为是按值传递的,所以每一次循环都会为当前i产生一个新的备份。

闭包的作用

上面的代码中,rs是闭包inner函数。rs共运行了三次,第一次,第二次,第三次,这说明在函数outer中的局部变量i一直保存在内存中,并没有在调用自动清除。

闭包的作用就是在outer执行完毕并返回后,闭包使javascript的垃圾回收机制(grabage collection)不会回收outer所占的内存,因为outer的内部函数inner的执行要依赖outer中的变量。(另一种解释:outer是inner的父函数,inner被赋给了一个全局变量,导致inner会一直在内存中,而inner的存在依赖于outer,因些outer也始终于在内存中,不会在调用结束后被垃圾收集回收)。

闭包有权访问函数内部的所有变量。当函数返回一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止。

闭包与变量

由于作用域链的机制,闭包只能取得包含函数中任何变量的最后一个值。看下面例子:

函数会返回一个数组,表面上看,似乎每个函数都应该返回自己的索引值,实际上,每个函数都返回,这是因为第个函数的作用域链上都保存着函数f的活动对象,它们引用的都是同一变量i。当函数f返回后,变量i的值为,此时每个函数都保存着变量i的同一个变量对象。我们可以通过创建另一个匿名函数来强制让闭包的行为符合预期。

这个版本中,我们没有直接将闭包赋值给数组,而是定义了一个匿名函数,并将立即执行匿名函数的结果赋值给数组。这里匿名函数有一个参数num,在调用每个函数时,我们传入变量i,由于参数是按值传递的,所以就会将变量i复制给参数num。而在这个匿名函数内部,又创建了并返回了一个访问num的闭包,这样,rs数组中每个函数都有自己num变量的一个副本,因此就可以返回不同的数值了。

闭包中的this对象

内存泄露

以上代码创建了作为el元素事件处理程序的闭包,而这个闭包又创建了一个循环引用,只要匿名函数存在,el的引用数至少为1,因些它所占用的内存就永完不会被回收。

把变量el设置null能够解除DOM对象的引用,确保正常回收其占用内存。

模仿块级作用域

任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。

闭包的应用

保护函数内的变量安全。如前面的例子,函数outer中i只有函数inner才能访问,而无法通过其他途径访问到,因此保护了i的安全性。在内存中维持一个变量。如前面的例子,由于闭包,函数outer中i的一直存在于内存中,因此每次执行rs(),都会给i加1。

浅析JS操作DOM的一些常用方法 getElementById():获取有指定惟一ID属性值文档中的元素getElementsByName(name):返回的是数组getElementsByTagName():返回具有指定标签名的元素子元素集合getAttribute():

JavaScript String 对象常用方法详解 字符串是不可变的。字符串方法,不会改变原有字符串的内容,而是返回一个新字符串。charAt():返回在指定位置的字符。concat():连接两个字符串文本

浅析js绑定事件的常用方法 浅析js绑定事件的常用方法xmlversion="1.0"encoding="UTF-8"!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""

标签: 全面理解全面把握全面落实

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

上一篇:JS创建事件的三种方法(实例代码)(js中事件的三要素)

下一篇:浅析JS操作DOM的一些常用方法(js domcontentloaded)

  • 个人所得税汇算清缴截止日期
  • 代销和委托代销区别
  • 二手车经纪公司和中介的区别
  • 城镇土地使用税的征税范围有哪些
  • 内账采购含税怎么转不含税
  • 供应商属于应收账款吗
  • 民非企业是否可以盈利
  • 三栏式明细账科目编号怎么填
  • 非税收入如何审查
  • 长期负债平均余额怎么算
  • 小规模企业应交增值税的二级科目
  • 资产已报废折旧怎么计算
  • 工会经费滞纳金税率
  • 房产税计税依据房产原值怎么算
  • 保证金可以抵货款吗
  • 技术开发合同可以开专票吗
  • 税控技术服务费怎么做账
  • 增值税开票资料没有电话可以吗
  • 7月1日发票新规定
  • 关于营改增发票开具的热点问题
  • 增值税申报内容及步骤
  • 分公司注销时其他应付款会计分录
  • 工程施工合同暂估价格入账会计分录
  • 公司账户收到车险怎么做账
  • 流动资产的损失计入哪里
  • 净利润等于未分配利润和盈余公积吗
  • 增值税减免税备案什么时候开始
  • 归还法人前期垫付款项
  • 收取的开票税点放哪个科目
  • 设计师用windows什么版本
  • 存续在业有什么区别
  • 固定资产折旧的会计凭证
  • linux的用法
  • php 数组定义
  • conda不是内部或外部命令
  • 企业发生的间接费用应先在
  • wordpress.org
  • 奥林匹克森林公园奥海
  • 不得领购使用增值税专用发票
  • 马卡雷纳大教堂
  • c语言设计酒店管理系统
  • 汇算清缴补交所得税怎么做凭证
  • 一个小柜的货代费用
  • 什么是会计确认的基础
  • 税控盘增值税发票怎么开
  • 规模以上企业纳税要求
  • 金蝶暂存凭证怎样转正常凭证
  • 工业企业会计核算中常见的会计核算程序有哪些?
  • 固定资产对外投资
  • 个人申请退税要交税吗
  • 个体工商户核算方式选哪个比较好
  • 有借款合同还要写借条吗
  • 没有收入有支出怎么处理账务
  • 停产工人工资计入哪个科目
  • 疫情期间购买消毒弥雾机的请示
  • 企业所有者权益在数量上等于
  • 减值准备包括哪几个方面
  • Vista系统提高ADSL上网速度的两种设置方法
  • 注册表出错打不开程序
  • mac trim功能
  • centos failed to start login service
  • Win10 Mobile 10572预览版上手体验视频
  • Mac上Parallels Desktop共享虚拟机怎么设置 Mac上Parallels Desktop共享虚拟机设置步
  • linux find命令详解xargs
  • linux仿mac
  • win7鼠标右键一闪就没了
  • windows8怎么设置锁屏时间
  • win7系统怎么创建虚拟网络
  • win7电脑无法上网 连接正常
  • css 分页
  • 15个常用的excel函数公式
  • python自动化源码
  • python解析chunked
  • 税务总局副局长饶
  • 河北省国家税务总局云办税厅
  • 车船税完税证明开具如何开具
  • 地税发票在哪里开
  • 电子低保证书在哪找
  • 2019小规模纳税人标准
  • 购买税控设备
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设