闭包
2015-07-21 19:01
274 查看
定义:函数嵌套函数,内部函数可以访问外部函数的变量和参数,外部函数的参数和变量不会被垃圾回收机制所收回。
好处:
一个变量可以长期驻扎在内存中
//函数aa执行完后,变量a不会被立即回收,bb还会调用a
function aa(){
var a=1;
return functionbb(){
alert(a);
}
}
var cc=aa();
cc();//2
不会污染全局变量
//可以实现变量a的累加,但是会污染全局变量
var a=1
function aa(){
a++;
alert(a);
}
aa();//2
aa();//3
//不能实现a的累加,在函数内部,虽然不会污染全局变量,但是变量a在函数执行完后会被回收,下次执行的时候会重新赋值。
function aa(){
var a=1;
a++;
alert(a);
}
aa();//2
aa()//2
//使用闭包可以实现a的累加,而且不会污染全局变量,外层函数执行完后a不会被回收
function aa(){
var a=1;
return functionbb(){
alert(a);
}
}
var cc=aa();
cc();//2
cc();//3
私有成员的存在
//私有成员的存在
var dd=(function aa(){
var a=1;
function bb(){
a++;
alert(a);
}
function cc(){
a++;
alert(a);
}
return {b:bb,c:cc}
})();
dd.b();//2
dd.c();//3
用法:
模块化开发
在循环中找到对应元素的索引
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>闭包演示</title>
<style type="text/css">
p {background:gold;}
</style>
<script type="text/javascript">
/*function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function() {
alert(i);
}
}
}
//加一层闭包,返回一个函数作为事件响应
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].onclick=(function(num){
return function(){
alert(num);
}
})(i);
}
}
//加一层闭包,i以函数参数形式传给内层函数
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
(function(num){
pAry[i].onclick=function(){
alert(num);
}
})(i);
}
}
//加一层闭包,i以局部变量形式传给内层函数
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
(function(){
var num=i;
pAry[i].onclick=function(){
alert(num);
}
})();
}
}
//将变量i保存在每个p对象的属性中
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].i=i;
pAry[i].onclick=function(){
alert(this.i);
}
}
}
//将变量i保存在匿名函数自身的属性中
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
(pAry[i].onclick=function(){
alert(arguments.callee.i);
}).i=i;
}
}
//利用Function构造函数
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].onclick=new Function("alert("+i+");");//new一次产生一个函数实例
}
}
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].onclick=Function("alert("+i+");");
}
}*/
</script>
</head>
<body onload="init();">
<p>产品 0</p>
<p>产品 1</p>
<p>产品 2</p>
<p>产品 3</p>
<p>产品 4</p>
</body>
</html>
好处:
一个变量可以长期驻扎在内存中
//函数aa执行完后,变量a不会被立即回收,bb还会调用a
function aa(){
var a=1;
return functionbb(){
alert(a);
}
}
var cc=aa();
cc();//2
不会污染全局变量
//可以实现变量a的累加,但是会污染全局变量
var a=1
function aa(){
a++;
alert(a);
}
aa();//2
aa();//3
//不能实现a的累加,在函数内部,虽然不会污染全局变量,但是变量a在函数执行完后会被回收,下次执行的时候会重新赋值。
function aa(){
var a=1;
a++;
alert(a);
}
aa();//2
aa()//2
//使用闭包可以实现a的累加,而且不会污染全局变量,外层函数执行完后a不会被回收
function aa(){
var a=1;
return functionbb(){
alert(a);
}
}
var cc=aa();
cc();//2
cc();//3
私有成员的存在
//私有成员的存在
var dd=(function aa(){
var a=1;
function bb(){
a++;
alert(a);
}
function cc(){
a++;
alert(a);
}
return {b:bb,c:cc}
})();
dd.b();//2
dd.c();//3
用法:
模块化开发
在循环中找到对应元素的索引
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>闭包演示</title>
<style type="text/css">
p {background:gold;}
</style>
<script type="text/javascript">
/*function init() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i<pAry.length; i++ ) {
pAry[i].onclick = function() {
alert(i);
}
}
}
//加一层闭包,返回一个函数作为事件响应
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].onclick=(function(num){
return function(){
alert(num);
}
})(i);
}
}
//加一层闭包,i以函数参数形式传给内层函数
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
(function(num){
pAry[i].onclick=function(){
alert(num);
}
})(i);
}
}
//加一层闭包,i以局部变量形式传给内层函数
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
(function(){
var num=i;
pAry[i].onclick=function(){
alert(num);
}
})();
}
}
//将变量i保存在每个p对象的属性中
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].i=i;
pAry[i].onclick=function(){
alert(this.i);
}
}
}
//将变量i保存在匿名函数自身的属性中
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
(pAry[i].onclick=function(){
alert(arguments.callee.i);
}).i=i;
}
}
//利用Function构造函数
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].onclick=new Function("alert("+i+");");//new一次产生一个函数实例
}
}
function init(){
var pAry=document.getElementsByTagName("p");
for(var i=0;i<pAry.length;i++){
pAry[i].onclick=Function("alert("+i+");");
}
}*/
</script>
</head>
<body onload="init();">
<p>产品 0</p>
<p>产品 1</p>
<p>产品 2</p>
<p>产品 3</p>
<p>产品 4</p>
</body>
</html>
相关文章推荐
- hdoj1020
- window8.1编译hadoop2 eclipse插件,并远程调试hadoop程序
- 【瞎搞】HDU 5288 OO’s Sequence
- Java 二分法查找算法
- HTML5 链接记录
- 单电机板机模型,f22
- 单电机板机模型
- 用java 写 merge sort
- 不要62 (暴力打表)
- 目录条目”SASHELP.EMCREDIT.IGN.SOURCE”不存在
- java 二叉树的查找方法
- Rescue-优先队列
- 十六进制转换为十进制
- 2015 Multi-University Training Contest 1
- 用Quartz 2D画小黄人
- 统计元音
- OSPF中的最短路径算法
- C#高级编程四十五天----格式字符串
- 登记申请汇总
- 5.编写一个计算器程序