Discuz教程网

通俗解释javascript的闭包

[复制链接]
authicon 09927306 发表于 2011-1-18 13:45:07 | 显示全部楼层 |阅读模式
什么是闭包呢?闭包就是函数实例执行过程中动态产生一个没有被释放资源的栈区,也是一个预执行的过程。
何谓没有被释放资源的栈区和预执行的过程,用一个最常见的示例来解释:
比方现在我们有一个ul,下面有很多个li,需要遍历他们为他们绑定单击事件,并在点击后将当前下标传递给另外一个function来进行额外的处理:
代码如下:

  1. for(var i=0; i<agroup.length; i++) {
  2.   agroup[i].onclick = function() {
  3.     handler(i);
  4.   }
  5. }
复制代码

执行结果显而易见对吧?在handler中,获取传递过去的参数i,你看到的将全部是最大的下标,这个时候,我们通常用下面的办法解决:
代码如下:

  1. for(var i=0; i<agroup.length; i++) {
  2.   agroup[i].i = i
  3.   agroup[i].onclick = function() {
  4.     handler(this.i);
  5.   }
  6. }
复制代码

那么在这里,先讲一下this的指向问题,从通常来说,javascript中的this是指向当前引用他的对象的。上面我们相当为this新增了一个为i的属性,他的值就是当前的下标值。
那么用闭包的方式如何解决这个问题?其实原理相同,我们需要预先的把i值保存起来,或叫作传递:
代码如下:

  1. for(var i=0; i<agroup.length; i++) {
  2.   agroup[i].onclick = function(index) {
  3.     return function() {
  4.       handler(index);
  5.     }
  6.   }(i);
  7. }
复制代码

这个时候你会得到正确的下标,这样做与增加i属性有何雷同之处?也就是他们都预先把下标i值传递或是储存起来。在上面的演示中,预执行onclick所引用的函数,而这个
函数当中返回了一个内嵌函数,形成一个没有被释放资源的栈区,并在预执行的时候将i值以参数的形式传入这个作用域(解释能力有问题,这句解释不知道是否准确,欢迎砖拍)。
综上所述,闭包的作用通常是改变作用域或预执行。应该看官很明白了,上面个出的示例很局限,闭包的应用范围是很广的,了解其因果,才能灵活的使用它。
auntion 2011-11-15
mail Auntion@gmail.com
QQ 82874972
原创文章,请尊重打字的辛劳和作者的权益,转载时请不要删除这里的作者信息。





上一篇:js 数据类型转换总结笔记
下一篇:javascript 内存回收机制理解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-3 17:33

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表