这篇文章主要介绍了 js 闭包所用的场合以及优缺点分析,十分的详细使用,有需要的小伙伴可以参考下。
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
先上段代码:
- //函数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();
所以关于闭包,就我自己的习惯而言,能不用就不用,如果非用不可,那就想办法保持闭包对象的数量很少甚至唯一。
来源: http://www.phperz.com/article/17/0216/270740.html