js闭包(二)
一、何谓“闭包”?
所谓“闭包(Closure)”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
描述的如此学术的官方解释,相信很少人能够理解,其实所有的函数都是一个闭包,不过我们所说的“闭包”通常指的是函数嵌套所产生的闭包。这种闭包更 为强大,它可以用优雅的方式来处理一些棘手的问题,有些程序员戏谑没有闭包简直就活不下去了,这虽然有些夸张,但从侧面却恰恰说明闭包有着非常强大的功 能。
1 |
<script type="text/javascript" language="javascript"> |
这就是一个使用闭包的简单示例,代码执行完毕后,函数对象并不会被垃圾回收机制(Garbage Collection)回收,函数内的临时变量就能够得以长期存在,有些类似静态变量的意味,而且值得一提的是,这个变量只能够被闭包函数修改,在外部是无法访问和修改的。
*垃圾回收机制:如果某个对象不再被引用,该对象将被回收。
二、闭包内的微观世界
如图所示,函数B的作用域链总共包含了3个部分:函数B的作用域、函数A的作用域和全局Window作用域。
三、闭包的应用
1、循环绑定事件的参数传递
1 |
<ul> |
2、设置延时或间隔时候的参数传递
1 |
<script type="text/javascript" language="javascript"> |
3、用闭包实现程序的暂停执行功能
1 |
<input type="button" value="Continue!" onclick="test()" /> |
4、自动执行的匿名函数
1 |
<script> |
这是闭包应用的一个非主流例子,这种形式并非我们通常所谓的“闭包”。我们创建了一个匿名函数并立即执行,由于外部对象无法引用它内部的变量,因此这些变量在函数执行完后很快就会被释放,关键是这种机制不会污染全局对象。
5、实现代码的封装和模块化,实现私有变量
1 |
<script type="text/javascript" language="javascript"> |
其实Javascript是不能直接实现像C语言中那样的私有成员的,不过在开发的时候,习惯性的统一约定以”_”下划线开头的变量为私有变量。
虽然如此,但是凭借Javascript强大的灵活性,我们完全可以间接的实现私有成员。从上述代码的运行结果可以看出,函数内部的作用域在外部是 无法访问的,但是通过闭包的形式可以访问,从而间接的实现了让person对象具有了私有变量_name,上边的代码还有另外一种表现形式,如下所示:
1 |
<script type="text/javascript" language="javascript"> |
虽然换了马甲,但是其实还是同样一个事物,只不过在这种表现形式下,闭包显得稍加隐晦,但是闭包还是闭包,它还是那么的强大。
6、实现面向对象中的对象
其实在上边一个例子中我们已经用到了这一特性,但是为了和其它语言中对象的实现形式更加相似,我们将上述代码再次加以改造,如下所示:
1 |
<script type="text/javascript" language="javascript"> |
四、使用闭包的代价
由于浏览器自身的缺陷,使用闭包时候很可能会造成内存泄露现象,这种现象在IE中尤为突出,内存泄露是一个比较严重的问题,轻则会影响浏览器的响应速度,降低用户体验,重则会造成浏览器无响应等现象。
JavaScript的脚本解释器具备一种垃圾回收机制,一般采用的是引用计数的形式,如果一个对象的引用计数为零,垃圾回收机制就会将其回收,这个过程是自动的。但是一旦当垃圾回收机制碰到了闭包,这个过程就变得复杂起来了。
在闭包中,因为局部变量可能在将来的某些时刻需要被使用,因此垃圾回收机制不会处理这些被外部引用到的局部变量,因此,倘若一旦出现循环引用,就会容易造成内存泄漏。
js闭包(二)的更多相关文章
- Js闭包常见三种用法
Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...
- js闭包理解实例小结
Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...
- js闭包(closure),个人理解
一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数 ...
- js闭包vs Java内部类
前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...
- js闭包实例汇总
本文是通过实例来帮助大家深刻理解js闭包,是篇非常不错的文章,这里推荐给大家,有需要的小伙伴可以参考下 Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取 ...
- js闭包的作用
js闭包的用途详解 js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文 我们来看 ...
- 探讨js闭包
背景:爱就要大胆说出来,对于编程我只想说,喜欢就大胆写出来.喜欢却不行动那就意味着失败.所以,对于在研究编程的猿们,我对同伴们说,大胆的学,大胆的写.呵呵,说这些其实无非是给我自己点动力,写下去的勇气 ...
- javascript深入理解js闭包(转)
javascript深入理解js闭包 转载 2010-07-03 作者: 我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
- js闭包中的this(匿名函数中的this指向的是windows)
js闭包中的this(匿名函数中的this指向的是windows) 一.总结 1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样 2.让匿名函数中的thi ...
- js闭包作用(避免使用全局变量)
js闭包作用(避免使用全局变量) 一.总结 1.优点::可以把局部变量驻留在内存中,可以避免使用全局变量; 2.缺点:也有占用更多内存的缺点,用完要及时让垃圾回收器回收 fn=null //应及时解 ...
随机推荐
- EF-按字段读取
/// <summary> /// 直接获取特定一个或者多个字段的值 /// 多个字段需要声明Model /// var s= testDal.GetScalar<dynamic&g ...
- 清北学堂(2019 5 1) part 4
今天讲数论 1.进制问题(将n转换成k进制数): 1.方法:短除法 将n/k,保存,将商当做新的n,将余数保存,直到商为0,将余数(包括0),倒序输出,即得n的k进制数 2.关于高精四则运算(我本以为 ...
- Swift中如何使用 #if DEBUG
Swift暂时还不支持大多数的预处理宏操作,但是可以支持“#if/#else/#endif”语句. 下面进行简单的设置使 #if DEBUG 有效,更详细的内容见:http://stackoverfl ...
- ROC曲线是通过样本点分类概率画出的 例如某一个sample预测为1概率为0.6 预测为0概率0.4这样画出来,此外如果曲线不是特别平滑的话,那么很可能存在过拟合的情况
ROC和AUC介绍以及如何计算AUC from:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ ROC(Receiver Operat ...
- jquery判断密码是否一致?
密码 请输入密码 重新输入密码 请输入新密码 <input type="text" id="btn0"> 密码 <span class=&qu ...
- L118
The company needs to focus on its biggest clients.This article discussed the events that led to her ...
- Soldier and Badges (set的检索简单运用)
Colonel has n badges. He wants to give one badge to every of his n soldiers. Each badge has a coolne ...
- RequireJS 也可以引入 VUE
RequireJS 也可以引入 VUE 由于 FastAdmin 是使用 RequireJS 导入 JS 模块的. 有人想把 VUE 也引入进去,虽然说也是可以,VUE 还是推荐使用 Webpack ...
- [转]JavaScript之引用类型
Object类型 Object类型是JavaScript中使用最多的一种类型.虽然Object的实例不具备多少功能,但对于在应用程序中存储和传输数据而言,它确实是非常理想的选择. 创建Object实例 ...
- phpstorm win/mac git配置 破解
http://blog.csdn.net/fenglailea/article/details/53350080 phpstorm中git配置教程: http://blog.csdn.net/knig ...