通过示例彻底搞懂js闭包
例1
functionsayHello(name)
{
vartext='Hello'+name;
varsayAlert=function(){console.log(text);}
sayAlert();
}
sayHello("Bob")//输出"HelloBob"
在sayHello()函数中定义并调用了sayAlert()函数;sayAlert()作为内层函数,可以访问外层函数sayHello()中的text变量。
例2
functionsayHello2(name)
{
vartext='Hello'+name;//局部变量
varsayAlert=function(){console.log(text);}
returnsayAlert;
}
varsay2=sayHello2("Jane");
say2();//输出"HelloJane"
例3
functionbuildList(list){
varresult=[];
for(vari=0;i
得到的结果:连续输出3个"item3undefined"
解析:通过执行buildList函数,返回了一个result,那么这个result存放的是3个匿名函数。然而这三个匿名函数其实就是三个闭包,因为它可以访问到父函数的局部变量。所以闭包内的保留的i是最终的值为3.所以list[3]肯定是undefined.item变量值为item3.
改成如下代码:
functionbuildList(list){
varresult=[];
for(vari=0;i
得到的结果:
item11
item22
item33
解释:这儿虽然传递了一个数组进去,但是返回的是三个自执行的函数。
例4
functionnewClosure(someNum,someRef)
{
varanArray=[1,2,3];
varnum=someNum;
varref=someRef;
returnfunction(x)
{
num+=x;
anArray.push(num);
console.log('num:'+num+";"+'anArray'+anArray.toString()+";"+'ref.someVar'+ref.someVar);
}
}
closure1=newClosure(40,{someVar:"closure1"});
closure2=newClosure(1000,{someVar:"closure2"});
closure1(5);//打印"num:45;anArray1,2,3,45;ref.someVarclosure1"
closure2(-10);//打印"num:990;anArray1,2,3,990;ref.someVarclosure2"
每次调用newClosure()都会创建独立的闭包,它们的局部变量num与ref的值并不相同。
例5
functionsayAlice()
{
varsayAlert=function(){console.log(alice);}
varalice='HelloAlice';
returnsayAlert;
}
varsayAlice2=sayAlice();
sayAlice2();//输出"HelloAlice"
alice变量在sayAlert函数之后定义,这并未影响代码执行。因为返回函数sayAlice2所指向的闭包会包含sayAlice()函数中的所有局部变量,这自然包括了alice变量,因此可以正常打印”HelloAlice”。
例6
functionsetupSomeGlobals(){
varnum=666;
gAlertNumber=function(){console.log(num);}
gIncreaseNumber=function(){num++;}
gSetNumber=function(x){num=x;}
}
setupSomeGlobals();
gAlertNumber();//输出666
gIncreaseNumber();
gAlertNumber();//输出667
gSetNumber(5);
gAlertNumber();//输出5
解释:首先gAlertNumber,gIncreaseNumber,gSetNumber是三个全局变量,并且其三个值都是匿名函数,然而这三个匿名函数本身都是闭包。他们操作的num都是保存在内存中的同一个num,所有会得出上面的结果。
以上这篇通过示例彻底搞懂js闭包就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
热门推荐
10 对患者生日祝福语简短
11 结婚祝福语简短装备
12 周岁祝福语学生文案简短
13 订婚领证祝福语简短精辟
14 导师获奖祝福语大全简短
15 新婚购房祝福语简短精辟
16 牛年祝福语简短的爱人
17 送芒果的祝福语简短
18 送给学长毕业祝福语简短