您的位置:首页 > Web前端 > JavaScript

JavaScript高级之闭包

2015-03-02 09:41 190 查看
一、什么是闭包

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

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

[javascript] view
plaincopy

function t1(){

var age = 20;

function t2(){

alert(age);

}

return t2;

}

var age = 100;

var temp = t1();

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] view
plaincopy

function counter(){

var i = 0;//但counter执行完毕后,除了返回的inc函数,其他函数访问不了变量i

var inc = function(){

return ++i;

}

return inc;

}

var c = counter();

alert(c());

alert(c());

alert(c());

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

[javascript] view
plaincopy

var counter = (function(){

var i = 0;

return function(){

return ++i;

}

})();

alert(counter());

alert(counter());

alert(counter());

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

转自:http://blog.csdn.net/guixuecheng/article/details/44002753
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: