js闭包总结

来源:互联网 发布:cocos2d js下载 编辑:程序博客网 时间:2024/05/21 10:14

今天小主复习了一下有关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
0 0