jS 闭包

一、什么是闭包

距离上一次更新有一段时间了,过年你懂得,接下来就谈谈JavaScript的高级用法——闭包。js的闭包其实不是什么难懂的高深的概念,只是有些书籍当中介绍的不够易懂或者说举得例子不太恰当,现在我们就通过简单的例子来理解“闭包”。作为程序员,也许一段针对的代码,比那些文字描述更能说明问题,用代码说话,眼见为实。

好了,先看下面的一段代码:

 

[javascript]
 
  1. function t1(){  
  2.      var age = 20;  
  3.       function t2(){  
  4.          alert(age);  
  5.      }  
  6.      return t2;  
  7.  }  
  8.  var age = 100;  
  9.  var temp = t1();  
  10.  temp();//20  


为了突出 执行效果,在t1函数外层也定义了一个age=100的变量,执行完 var temp = t1(); 后,将函数t2赋予了temp,这样temp其实就是t2函数的引用,紧接着执行temp,输出结果竟然是20,毫无疑问,变量age是在t1函数的作用域下的,你已经看到JavaScript语言与其他语言不同的地方。

 

在大部分语言中,如java,函数t1内的局部变量会随着函数t1执行结束而销毁,但是在js中,变量age=20却被t2捕抓,即使是t1函数执行结束后,依然可以通过t2访问到age
  这种情况,即返回的t2函数不是孤立的,甚至把周围的变量环境,形成了一个‘封闭包’,一起返回,所以叫‘闭包’


二、闭包的应用

JavaScript既然有闭包的实现,那么JavaScript的闭包是怎么使用的或应用在哪种情况下呢?通过上面的例子已经看到,函数t1内部的age变量只能通过返回的t2函数访问,那么age是不是相当于java的private私有变量呢,哈哈,这个在下一篇会讲到,而且将通过“闭包”将属性封装在内部,做成接口,别人也就看不见,也不会污染到其他的变量,想想是不是呢。

讲那么多,我们就通过一个实际的例子看看:

要求:实现一个计数器,每次调用某函数,使计时器的值加1

1、闭包实现

 

[javascript]
 
  1. function counter(){  
  2.      var i = 0;//但counter执行完毕后,除了返回的inc函数,其他函数访问不了变量i  
  3.      var inc = function(){  
  4.          return ++i;  
  5.      }  
  6.      return inc;  
  7.  }  
  8.  var c = counter();  
  9.  alert(c());  
  10.  alert(c());  
  11.  alert(c());  

2、可以结合“匿名”函数,进行简化

 

 

[javascript] 
 
  1. var counter = (function(){  
  2.      var i = 0;  
  3.      return function(){  
  4.          return ++i;  
  5.      }  
  6.  })();  
  7.  alert(counter());  
  8.  alert(counter());  
  9.  alert(counter());  

相信你已经看到了闭包的好处,但是请不到胡乱使用闭包,因为在IE浏览器下是使用“计数”的方式跟踪对象来进行垃圾回收的,由于闭包的特新,不会释放局部变量,如果造成过多的循环引用,将会引起“内存泄露”。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。