位置: 编程技术 - 正文

javascript闭包(Closure)用法实例简析(javascript闭包运行原理)

编辑:rootadmin

推荐整理分享javascript闭包(Closure)用法实例简析(javascript闭包运行原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript闭包的作用,javascript闭包的作用,javascript闭包运行原理,javascript闭包运行原理,javascript闭包的作用,Javascript闭包好处,Javascript闭包好处,javascript 闭包,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了javascript闭包(Closure)用法。分享给大家供大家参考,具体如下:

closure被翻译成“闭包”,感觉这东西被包装的太学术化。下面参考书本和网上资源简单探讨一下(理解不当之处务请留意)。

1、什么是闭包

官方的回答:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

看了上面的定义,如果你不是高手,我坚信你会和我一样愤怒的质问:这tmd是人话吗?要理解闭包,还是代码最有说服力啊,上代码:

上面代码中,注释已经写的清清楚楚。现在我们可以这么理解“闭包”:在函数体内定义另外的函数作为目标对象的方法函数(示例中就是在函数funcTest内定义另外的函数innerFuncTest作为funcTest的方法函数),而这个对象的方法函数反过来引用外层函数体中的临时变量(闭包是一种间接保持变量值的机制。示例中就是内部函数innerFuncTest引用外层函数funcTest的临时变量tmpNum,这里必须注意,临时变量可以包括外部函数中声明的所有局部变量、参数和声明的其他内部函数)。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包(示例中,调用函数的时候,myFuncTest实际调用的是innerFuncTest函数,也就是说funcTest的一个内部函数innerFuncTest在funcTest之外被调用,这时就创建了一个闭包)。

2、两个利用闭包的例子

下面举两个例子,一个是因为闭包导致了问题,而另一个则利用闭包巧妙地通过函数的作用域绑定参数。

这两个例子相关的HTML标记片断如下:

(1)、因闭包而导致问题

上面的HTML标记片断中有4个<a>元素,现在要给后三个指定事件处理程序,使它们在用户单击时报告自己在页面中的顺序,比如:当用户单击第2个链接时,报告“您单击的是第1个链接”。为此,如果编写下列为后三个链接添加事件处理程序的函数:

javascript闭包(Closure)用法实例简析(javascript闭包运行原理)

然后,在页面载入完成后(不然可能会报错)调用该函数:

看一下运行结果,此时单击后3个链接,会看到警告框中显示什么信息呢?——全都是“您单击的是第4个链接”。是不是令你感到十分意外?为什么?

分析:因为在badClosureExample()函数中指定给element.onclick的事件处理程序,也就是onclick那个匿名函数是在badClosureExample()函数运行完成后(用户单击链接时)才被调用的。而调用时,需要对变量i求值,解析程序首先会在事件处理程序内部查找,但i没有定义。然后,又到 badClosureExample()函数中查找,此时有定义,但i的值是4(只有i大于4才会停止执行for循环)。因此,就会取得该值——这正是闭包(匿名函数)要使用其外部函(badClosureExample)作用域中变量的结果。而且,这也是由于匿名函数本身无法传递参数(故而无法维护自己的作用域)造成的。

那么这个例子的问题怎么解决呢?其实方法有很多(自己不妨写一下看看),我认为比较简单直接的代码:

(2)、巧妙利用闭包绑定参数

还是上面的HTML片段,我们要在用户单击第一个链接时延时弹出一个警告框,怎么实现?答案是使用setTimeout()函数,这个函数会在指定的毫秒数之后调用一个函数,如:但问题是,无法给其中的someFunc函数传递参数。而使用闭包则可以轻松解决这个问题:

函数goodClosureExample用来返回一个匿名函数(闭包)。而我们可以通过为它传递参数来使返回的匿名函数绑定该参数,如:而此时,就可以将绑定了参数的good函数传递给setTimeout()实现延时警告了:最后,测试通过的完整代码:

3、javascript的垃圾回收原理

(1)、在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收;

(2)、如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

在js中使用闭包,往往会给javascript的垃圾回收器制造难题。尤其是遇到对象间复杂的循环引用时,垃圾回收的判断逻辑非常复杂,搞不好就有内存泄漏的危险,所以,慎用闭包。ms貌似已经不建议使用闭包了。

希望本文所述对大家JavaScript程序设计有所帮助。

javascript针对cookie的基本操作实例详解 本文实例讲述了javascript针对cookie的基本操作。分享给大家供大家参考,具体如下:js被C#、JAVA等开发者视为声名狼藉的附属编程语言是有道理的,比如

Bootstrap每天必学之媒体对象 在Web页面或者说移动页面制作中,常常看到这样的效果,左边居左(或居右),内容居右(或居左)排列,如下图所示:我们常常把这样的效果称为媒

Bootstrap每天必学之面板 1、面板面板(Panels)是Bootstrap框架新增的一个组件,其主要作用就是用来处理一些其他组件无法完成的功能。同样在不同的版本中具有不同的源码:Less

标签: javascript闭包运行原理

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

上一篇:详解JavaScript的流程控制语句(javascript总结)

下一篇:javascript针对cookie的基本操作实例详解(javascript keyup)

  • 附加税税率是多还是少
  • 扣缴义务人和纳税人举例
  • 开红字发票需要收回原发票吗
  • 劳务报酬自行申报时间
  • 个体工商户生产经营所得税税率表2021
  • 出售旧房及建筑物计算土地增值税
  • 不征收耕地占用税的情形
  • 在建工程明细科目
  • 出口企业收入分录
  • 总分包外地施工怎样预缴税款?
  • 新成立的公司银行存款如何入账
  • 直接减免的增值税计入哪个科目
  • 租车租赁费税率是多少
  • 母公司向全资子公司增资
  • 企业所得税季度预缴纳税申报表
  • 铝合金失效分析案例
  • 为什么电脑上找不到蓝牙耳机
  • 应税货物销售额怎么计算
  • 集团公司内部无偿借贷增值税
  • 进项已抵扣怎么申报
  • 收的的挂靠费一般是几个点
  • 企业福利费支出范围
  • 应收账款的账务处理方式是什么
  • 在建工程及时结转重要性
  • 政府专项基金是什么
  • 支付银行贷款利息计入现金流量表
  • 贷款逾期的本金利息
  • 贷款损失准备的作用
  • 单位未足额缴纳社保可以补交几年
  • PHP:imagecolorsforindex()的用法_GD库图像处理函数
  • 现金折扣发生销售退回
  • vue传值inject
  • php不刷新提交
  • 业务招待费的企业是什么
  • vuecli项目实战
  • 接口多继承的写法
  • 租入厂房需做环保检测吗
  • python处理数据教程
  • 中小企业的资产负债率均值是多少
  • 厂房和设备折旧年限
  • 小规模纳税人是什么意思
  • 发票明细怎么导出数量
  • 增值税纳税申报操作流程
  • python怎么过滤多余空格
  • javascript基础笔记
  • 企业出租无形资产使用权取得的收入应计入
  • 汽车保险合同由什么组成
  • 政府无偿划转股权印花税
  • ms sql 2012
  • 哪些增值税专用发票不能抵扣进项税
  • 企业哪些账户可以取现金
  • 留样产品的保存期限
  • 社保退休金计算方法
  • 销售包装物计入其他应收款吗
  • 职工医保门诊一年报销多少钱
  • 其他应付款属于哪类
  • 毛利润利润总额净利润的关系图
  • 回购股票会导致所有者权益减少吗
  • 上月有留抵税额本月怎么申报
  • 零售行业涉及到什么专业
  • 创建mysql表sql语句
  • mysql5.7.27安装
  • sql高级语句实例
  • Win10 Mobile 10549预览版增DPI缩放 瞬间手机变电脑
  • U盘安装centos7步骤
  • ubuntu唤醒快捷键
  • w10消费者版本和专业版区别
  • 简单说明ssh远程登录流程
  • win7系统电脑打开的软件闪退怎么办
  • windows10更新将重启若干次
  • win8系统安装包
  • perl 删除文件
  • socketjs-node/info
  • python数据分析入门教程
  • 个人出租商铺要交土地使用税吗
  • 增值税纳税申报表附列资料(三)
  • 安徽税务发票查询入口
  • 营改增后土地增值税
  • 青岛新农合咨询电话
  • 个税专项扣除填报错误怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设