js闭包所用的场合以及优缺点分析

 更新时间:2015年06月22日 09:48:34   投稿:hebedich  
这篇文章主要介绍了js闭包所用的场合以及优缺点分析,十分的详细使用,有需要的小伙伴可以参考下。

先上段代码:

//函数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();

所以关于闭包,就我自己的习惯而言,能不用就不用,如果非用不可,那就想办法保持闭包对象的数量很少甚至唯一。

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • JavaScript使用Promise实现并发请求数限制

    JavaScript使用Promise实现并发请求数限制

    本文主要介绍了JavaScript使用Promise实现并发请求数限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • javascript实现捕捉键盘上按下的键

    javascript实现捕捉键盘上按下的键

    JavaScript取得按下键盘的键是哪个,通过创建一个event.keyCode对象,可有效获取键盘上的键,运行代码后,点击键盘上的任意键,网页上显示你按下的是哪个键。
    2015-05-05
  • 重学JS之显示强制类型转换详解

    重学JS之显示强制类型转换详解

    这篇文章主要给大家介绍了关于重学JS之显示强制类型转换的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用JS具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)

    viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)

    这篇文章主要介绍了Viewer这一款强大的 jQuery 图像浏览插件,在信息详情页面实现点击图片可以预览,脚本之家也是用的这个js,这里为分享一下使用方法,需要的朋友可以参考下
    2020-04-04
  • JavaScript变量Dom对象的所有属性

    JavaScript变量Dom对象的所有属性

    这篇文章主要介绍了JavaScript变量Dom对象的所有属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 原生JS:Date对象全面解析

    原生JS:Date对象全面解析

    下面小编就为大家带来一篇原生JS:Date对象全面解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • javascript中checkbox使用方法实例演示

    javascript中checkbox使用方法实例演示

    这篇文章通过简单的实例演示了javascript中checkbox使用方法,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • 如何用js将blob为pcm格式转换为MP3格式

    如何用js将blob为pcm格式转换为MP3格式

    要将PCM文件转换为MP3文件,您可以使用Js实现,这篇文章主要给大家介绍了关于如何用js将blob为pcm格式转换为MP3格式的相关资料,需要的朋友可以参考下
    2023-11-11
  • Bootstrap~多级导航(级联导航)的实现效果【附代码】

    Bootstrap~多级导航(级联导航)的实现效果【附代码】

    下面小编就为大家分享一篇Bootstrap~多级导航(级联导航)的实现效果【附代码】。小编觉得挺不错。希望对大家有所帮助。一起跟随小编过来看看吧
    2016-03-03
  • JavaScript实现添加及删除事件的方法小结

    JavaScript实现添加及删除事件的方法小结

    这篇文章主要介绍了JavaScript实现添加及删除事件的方法,实例总结了javascript对事件的添加及删除的技巧,涉及javascript事件绑定的方法及浏览器兼容的相关注意事项,需要的朋友可以参考下
    2015-08-08

最新评论