1、闭包:定义在一个函数内部的函数,内部函数可以通过作用域链访问外部函数的变量,外部函数将内部函数返回,(一个函数在定义它的作用域外部被引用)使变量在函数外可见。例如:
function f1(){
var n=999;//本来作用域的限制使函数外无法直接访问此变量
function f2(){
alert(n);
}
return f2;//将内部函数返回
}
var result=f1();
console.log(n);//报错,n is undefined
result(); // 999
2、闭包的用途:
- 读取函数内部的变量
- 让这些变量的值始终保持在内存中(就是外部函数的活动对象一直没能被释放,始终占据这一片内存)
function outer(){
var a=999;
nAdd=function(){a++}
return function(){
console.log(a);
}
}
var result=outer();//result一直调用着outer返回的函数,导致outer函数的活动对象不能被释放,使变量一直保存在内存中
result();//输出999
nAdd();//nAdd定义的是全局变量,可以在函数外部被访问到,同时它也形成了一个闭包的结构,使函数内部的变量发生了改变
result();//输出1000;改变之后的值
3、怎么创建闭包:
1、在一个函数内部直接返回一个匿名函数,也可以先定义一个变量指向一个匿名函数,然后返回这个变量;
2、在函数外部定义一个变量接住返回的函数。
3、调用返回的函数
1、 function outer(){
var a=999;
return function(){//返回一个匿名函数
a++;
console.log(a)
}
}
var result=outer();//定义一个变量接住返回的函数
result();//调用返回的函数
2、 function outer(){
var a=999;
function inner(){
a++;
console.log(a)
}
return inner;//注意这里不能加括号,否则result()会报错,因为不能undefined()
}
var result=outer();
result();