马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一.闭包:
全局变量:在程序任何位置都可访问(修改)。
问题:存在全局污染
- //全局污染
- var n=0;
- function getNum(){
- return ++n;
- }
- console.log(getNum());
- console.log(getNum());
- n=100;
- console.log(getNum()); console.log(getNum());
复制代码
局部变量:不可重用!
- //局部变量
- function getNum(){
- var n=0;
- return ++n;
- }
- console.log(getNum());
- console.log(getNum());
- n=100;console.log(getNum());
复制代码
解决:即要重用变量,又要保护变量不被污染,则使用闭包
如何创建闭包:
1. 先用外层函数封装一个受保护的局部变量
2. 再在内层函数中操作外层函数的变量
3. 外层函数将内层函数返回到外部,在外部反复调用。
- //闭包
- function outer(){
- var n=0;
- return function(){return ++n;}
- }
- var getNum=outer();
- //getNum:function(){return ++n;}
- console.log(getNum());
- console.log(getNum());
- n=10;
- console.log(getNum()); console.log(getNum());
复制代码
如何判断是否是闭包:
1. 函数嵌套!
2. 内层函数使用外层函数的局部变量
3. 内层函数被返回到外部,在外部调用。
何时使用闭包:即要重用变量,又要保护变量不被污染
缺点:占用更多内存空间——因为outer的活动对象无法释放。
判断闭包输出:
1. 同一次外层函数调用返回的内层函数,操作同一个变量
2. 外层函数调用了几次,就有几个受保
例如:
- //闭包练习
- function outer(){
- for(var i=0,arr=[];i<3;i++){
- arr=function(){return i};//i是受保护的变量
- }
- //循环结束后,i=3
- return arr;
- }
- var getFuns=outer();
- //只有1个受保护的变量i=3
- //getFuns:[
- //function(){return i},
- //function(){return i},
- //function(){return i}
- //]
- console.log(getFuns[0]()); //3
- console.log(getFuns[1]()); //3 console.log(getFuns[2]()); //3
复制代码
|