闭包是一种嵌套函数结构:在一个函数内定义的一个函数或者函数表达式
闭包的必要条件:内部函数应该访问外部函数声明的私有变量、参数或其它内部函数,此时如果外部函数 外 调用这个内部函数于是它就成了闭包函数
函数的功能:设计逻辑结构
闭包:存储和传输数据,即是函数的数据包,这个数据包在函数执行过程中始终处于激活状态,但函数调用返回之后,闭包保存着与函数关联变量的动态联系
使用:
1.跟踪动态环境中数据的实时变化,并即使存储
function f(){
var a=1;
var b=function(){
return a;//
}
a++;//继续引用外部函数定义的局部变量a中的值,直到外部函数f()调用返回
return b;
}
var c=f();
alert(c()) //注意,这里是2,不是1
2.利用闭包存储变量所有的变化值
function f(x){
var a=[];
for (var i =0;i<x.length;i++){
var temp=x[i];
//a.push(function(){
// alert(temp+''+x[i])
// })
a.push(
(function(temp,i){
return funciton(){
alert(temp+''+x[i])
}
})(temp,i)
)
}
return a;
}
function e(){
var a=f(["a","b","c"]);
for(var i=0;i<a.length;i++){
a[i]();
}
}
e();
3.利用一个闭包生声明多个闭包
funciton f(x){
var temp=x;
return function(x){
temp +=x;
alert(temp);
}
}
var a=f(50) //生成第一个闭包
var b=f(100)//生成第二个闭包
a(5)//返回55
b(10)//返回110
4.闭包的双层结构
function f(x){
return function(){
return function(){
return x;
}
}
}
var a=f(5);
var b=f(5);
alert(a===b) //false 注意了,说明a和b引用的是不同函数实例
改写成复杂函数表达式,a会等于b
var f=function(x){
var e=function(){return x;}
return funciton(){ return e;}
} (5);
var a=f();
var b=f();
alert (a===b) //true