1,闭包:闭包是指有权访问另一个函数作用域的变量的函数。
2,闭包的一般形式
function f1(){
function f2(){}
return f2
}
3,举例
例一,
function f1(){
var name="tom001",age=18,isgroup=false;
function f2(){
return "i am f2 function";
}
return f2;
}
//alert(f1());// function f2(){return "i am f2 function"; }
// alert(f1().f2);//undefined
//调用内部函数
alert(f1()());//i am f2 function
或者
var ff=f1(); //ff=f2;
ff();
例二,
function f1(){
var name="tom001",age=18,isgroup=false;
function f2(){
return "i am f2 function-"+name;
}
return f2;
}
alert(f1()());//i am f2 function -tom001
例三,
function f1(){
var age=18,isgroup=false;
function f2(){
var nn="tom001"
return nn;
}
// console.log(f2());
return f2;
}
//想得到nn值
alert(f1()()); //tom001
4,闭包例题
例题一
var arr=new Array();
for(var i=0;i<5;i++){
arr[i]=function () {
alert(i);
}
}
arr[0]();
arr[1]();
arr[2]();
arr[3]();
arr[4]();
//5,5,5,5,5
为什么不是1,2,3,4,5
因为在完成循环后i的值已经是5了(for循环中的i是全局变量),调用arr[0](),arr[0](),arr[1]()......时会调用全局变量i,所以输出时会是5,5,5,5,5
解决方法
var arr=new Array();
for(var i=0;i<5;i++){
arr[i]=f1(i)
}
function f1(n){
functionf2(){
alert(n)
}
return f2;
}
arr[0]();//f1()=f2;f1()=arr[];arr[]()=f1()()=f2();
arr[1]();
arr[2]();
arr[3]();
arr[4]();
原因:i被传到f1()函数中时,这是的 i 即n已经不是全局变量了,而是在闭包环境下的i了。
例题二
document.body.innerHTML='<div id="div1">aaa</div>'
+<div id=“div2”>bbb</div>+<div id="div3">ccc</div>
for(var i=1;i<4;i++){
docment.getElementById('div'+i).addEventListener('click',function(){
alert(i); //all are4
})
}
解决方法
for(var i=1;i<4;i++){
!function(i){
docment.getElementById('div'+i).addEventListener('click',function(){
alert(i); //all are4
}
}
网友评论