今天小主复习了一下有关js闭包的问题,下面给大家分享一下自己的学习心得,与什么不足之处,还望大家批评指正
闭包:
既重用局部变量,又保护变量不受污染的机制
为什么:
全局变量:随处可用,可重复使用
缺点:极易被污染
局部变量:不会被污染
缺点:不可反复使用,只能在函数内使用
何时使用闭包:
如果希望一个变量可以反复使用且不被污染!
闭包三步:
①外层函数包裹受保护的变量和操作变量的内层函数
②外层函数返回内层函数
③调用外层函数,用一个变量接着,获得内层函数对象
笔试中:
①先找到受保护的变量
特殊:受保护的额变量很肯能不是声明时的初始值—看外层函数调用结束时的值
②找到操作变量的值,确定如何操作
特殊:2中办法返回
①return
②肯能直接给全局变量赋值
下面给大家举个具体的例子:
例一:
function f(){
var n=1;
return function(){return n++;}
}
var getNum=f();
console.log(getNum());//1
console.log(getNum());//2
console.log(getNum());//3
例子二:
function fun(){
for(var i=0,arr=[];i<3;i++){
arr[i]=function(){return i;}
}
return arr;
}
var funs=fun();
console.log(
funs[0](),//3
funs[1](),//3
funs[2]()//3
);
分析:
首先:
for(var i=0,arr=[];i<3;i++){
arr[i]=function(){return i;
}
这里的function(){return i;}没有被调用不会被执行,所以后面return arr返回的是三个函数对象
其次:
var funs=fun();
funs中装了三个还没有执行的函数
funs:[
function(){return i;},
function(){return i;},
function(){return i;}
]
例子三:
function outer(){
var i=999;
nAdd=function(){i++;}
/*
为一个从未声明过的变量进行赋值,会在全局自动创建-------禁止使用
*/
return function(){return i;}
}
var getNum=outer();
console.log(getNum(),nAdd(),getNum());//999 undefined 1000