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();