先上段代码:
//函数a function a() { var i=0; //函数b function b() { alert(++i); } return b; } //函数c var c = a(); c();
代码特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
代码中函数a的内部函数b,被函数a外面的一个变量c引用的时候,这就叫创建了一个闭包。有时候函数b也可以用一个匿名函数代替来返回,即return function(){};
优点:1.保护函数内的变量安全,加强了封装性 2.在内存中维持一个变量(用的太多就变成了缺点,占内存)
闭包之所以会占用资源是当函数a执行结束后, 变量i不会因为函数a的结束而销毁, 因为b的执行需要依赖a中的变量。
不适合场景:返回闭包的函数是个非常大的函数
闭包的典型框架应该就是jquery了。
闭包是javascript语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。
这在做框架的时候体现更明显,有些方法和属性只是运算逻辑过程中的使用的,不想让外部修改这些属性,因此就可以设计一个闭包来只提供方法获取。
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
总结一下:
优点:
1. 逻辑连续,当闭包作为另一个函数调用的参数时,避免你脱离当前逻辑而单独编写额外逻辑。
2. 方便调用上下文的局部变量。
3. 加强封装性,第2点的延伸,可以达到对变量的保护作用。
缺点:
闭包有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效内存的产生,看下面的例子:
var array = []; function abc() { var foo = function(){ } array.push(foo); return foo; } for(var i = 0 ; i < 10000; i ++) { abc(); } alert(array[0] == array[1]);
通过上面的测试我们会看到这一万次abc()执行所产生的同一个逻辑的闭包的地址并不相同,也就是说它生产了一堆的一模一样的Function对象,这样有好处就是可以以工厂模式产生函数以备使用,然而如果你的稍有不慎将闭包当做常态逻辑使用,就不可避免的会造成内存垃圾。当中换个语法可能更好理解:
var foo = new Function();
所以关于闭包,就我自己的习惯而言,能不用就不用,如果非用不可,那就想办法保持闭包对象的数量很少甚至唯一。
以上所述就是本文的全部内容了,希望大家能够喜欢。
js,闭包,优缺点
更新日志
- 曝多款《战神》重制版游戏正在开发:或于明年3月官宣
- 周葆元.1994-总有一天你会懂【飞碟】【WAV+CUE】
- 群星.1992-妖兽都市电影原声帶【滚石】【WAV+CUE】
- 林忆莲.1996-回忆总是美好的超级精丫飞碟】【WAV+CUE】
- 好舒服宝宝《好舒服宝宝音乐, Vol.5》[FLAC/分轨][71.21MB]
- 宝藏男孩《超越期待》[320K/MP3][88.88MB]
- 宝藏男孩《超越期待》[FLAC/分轨][247.62MB]
- 陈随意2009-爱你一世人[美华][WAV+CUE]
- 风信子1992-以为你在等我这样的人[歌林][WAV+CUE]
- 高胜美高胜云.2002-山地思情篇【皇星全音】【WAV+CUE】
- 逼迫中国选手弃权事件爆发后 万代官号发水豚君仰望天空
- 国外玩家恶搞奎爷去中国杀神:遇到孙悟空揍二郎神
- 育碧官宣《刺客信条幻景》上架Steam:本月正式发售
- 林俊杰.2015-和自己对话2CD【华纳】【WAV+CUE】
- 陈山河.1992-为你付出【喜玛拉雅】【WAV+CUE】