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
距离上一次更新有一段时间了,过年你懂得,接下来就谈谈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
相关文章推荐
- JavaScript 高级篇之闭包、模拟类,继承(五)
- javascript 高级 闭包
- JavaScript高级程序设计之函数表达式之闭包之闭包与变量第7.2.1讲笔记
- JavaScript高级内容笔记:原型链、继承、执行上下文、作用域链、闭包
- 《JavaScript高级程序设计 第三版》学习笔记 (六) 函数与闭包详解
- 再谈javascript闭包--Javascript高级用法 ----在Javascript中,什么是闭包(Closure)
- JavaScript高级程序设计闭包
- Javascript高级程序设计——this、闭包、函数表达式
- JavaScript 高级篇之闭包、模拟类,继承(五)
- JavaScript 4.3 函数高级-闭包
- javascript(重要内置对象,json处理,闭包详解)高级特性详解
- JavaScript高级之闭包的概念及其应用
- JavaScript高级之闭包的概念及其应用
- JavaScript高级程序设计之函数表达式之闭包第7.2讲笔记
- JavaScript【5】高级特性(作用域、闭包、对象)
- JavaScript 高级篇之闭包、模拟类,继承(五)
- JavaScript高级之闭包的概念及其应用
- 【javascript】高级js--(面向对象js,arguments,闭包,自调)
- js匿名函数及闭包(javaScript高级程序设计第3版)
- javascript高级程序教程中关于闭包与变量的问题