浅析javascript闭包 实例分析

 更新时间:2010年12月25日 22:35:43   作者:  
闭包是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),因而这些变量也是环境表达式的一部分。
官方解释
“闭包”是一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),因而这些变量也是环境表达式的一部分。
通俗解释
Javascript中所有的函数都是一个闭包。不过一般来说,嵌套的function产生的闭包更为强大,也是大部分时候我们所说的“闭包”。看如下代码:
复制代码 代码如下:

<script type="text/javascript">
<!--
//外层函数a
function a(){
//临时变量i
var i = 0;
//内层函数b
function b(){
//引用外层临时变量i
alert(++i);
}
//执行结果,返回内层函数b
return b;
}
//执行外层函数a,同时给c一个指向内层函数b的引用
//若按正常理解,此语句执行完后i将被GC回收,此时的i应为“undefine”
var c = a();
//执行内层函数,由于闭包的缘故,函数b中i仍然引用的是外部的临时变量i
c();
-->
</script>

这段脚本在执行完var c=a()之后,变量c实际上就指向了函数b,b中用到了变量i,再执行c()后就会弹出一个窗口显示i的值。这段代码其实就是一个闭包,为什么?因为函数a外的变量c引用了函数a内部的函数b。
Javascript的垃圾回收机制
由于javascript特殊的垃圾回收机制,才导致了闭包的产生。Javascript垃圾回收机制的大体规则如下:
在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象相互引用,而不再被第3者引用,那么这两个互相引用的对象也会被回收。而在上述的脚本中,函数a被b引用,函数b又被函数a外的c所引用,这就是为什么函数a执行后不被回收的原因。
闭包的应用场景
1. 保护函数内的变量安全。以上面的例子为例,函数a中变量i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
2. 在内存中维持一个变量。依然如上面的例子,由于闭包,函数a中的i一直存在于内存中,因此每次执行c(),i都会加1。
3. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)。如下,私有属性和私有方法在Constructor外是无法访问的:
复制代码 代码如下:

function Constructor(…){
var that = this;
var membername = value;
function membername(…){…}
}

相关文章

  • 弹出广告特效(一个IP只弹出一次)的代码

    弹出广告特效(一个IP只弹出一次)的代码

    弹出广告特效(一个IP只弹出一次)的代码...
    2007-07-07
  • 页面自定义拖拽布局

    页面自定义拖拽布局

    页面自定义拖拽布局...
    2007-02-02
  • 详解js静态检查工具eslint配置文件

    详解js静态检查工具eslint配置文件

    这篇文章主要介绍了js静态检查工具eslint配置文件的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-11-11
  • 浅谈JavaScript 代码简洁之道

    浅谈JavaScript 代码简洁之道

    这篇文章主要介绍了浅谈JavaScript 代码简洁之道,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 一秒学会微信小程序制作table表格

    一秒学会微信小程序制作table表格

    这篇文章主要教大家一秒学会微信小程序制作table表格,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 使用JS前端技术实现静态图片局部流动效果

    使用JS前端技术实现静态图片局部流动效果

    本文使用前端开发技术,结合 SVG 和 CSS 来实现类似的液化流动效果,包含的知识点主要包括:mask-image 遮罩、feTurbulence 和 feDisplacementMap 滤镜、filter 属性、canvas 绘制方法、TimelineMax 动画及input[type=file] 本地图片资源加载,需要的朋友可以参考下
    2022-08-08
  • 使用CSS3的scale实现网页整体缩放

    使用CSS3的scale实现网页整体缩放

    QQ邮箱的网页整体缩放效果,原来实现方法如此简单,下面有个实现示例,大家可以参考下
    2014-03-03
  • JavaScript遍历数组和对象的元素简单操作示例

    JavaScript遍历数组和对象的元素简单操作示例

    这篇文章主要介绍了JavaScript遍历数组和对象的元素简单操作,结合实例形式分析了javascript数组与对象元素遍历相关操作技巧与注意事项,需要的朋友可以参考下
    2019-07-07
  • JS获取年月日时分秒的方法分析

    JS获取年月日时分秒的方法分析

    这篇文章主要介绍了JS获取年月日时分秒的方法,结合实例形式分析了JS获取具体时间的常犯错误与相应解决方法,需要的朋友可以参考下
    2016-11-11
  • 基于JavaScript实现文件秒传功能

    基于JavaScript实现文件秒传功能

    在互联网高速发展的今天,文件上传已经成为网页应用中的一个基本功能,随着用户上传文件尺寸的不断增大、对质量清晰度的要求也越来越高,所以本文给大家介绍了如何使用JavaScript实现文件秒传功能,需要的朋友可以参考下
    2024-01-01

最新评论