closure

更新时间:2023-01-01 16:04:05 阅读: 评论:0


2023年1月1日发(作者:阿肯)

javascript闭包的理解、运⽤和销毁

javascript闭包的理解和运⽤

什么是闭包?

1、闭包让你可以在⼀个内层函数中访问到其外层函数的作⽤域。引⽤于:

2、闭包是⼀种保护私有变量的机制,在函数执⾏时形成私有的作⽤域,保护⾥⾯的私有变量不受外界⼲扰。直观的说就是形成⼀个不

销毁的栈环境。引⽤于:

PS:看看就好,看不懂也没关系

闭包的理解

⽐较直⽩的来理解闭包概念:

形成闭包的条件:

内外2层函数

内部函数中使⽤了⽗函数的变量

内部的私有变量外界可以引⽤,但⽆法改变,且不轻易被销毁

下⾯来看代码:

//外层函数

constouterFn=()=>{

//私有变量,可以通过内层函数访问,但⽆法被外界⼲预

letcount=0;

//内层函数

constinnerFn=()=>{

('内部count',count++);//使⽤了⽗函数的变量

returncount;

}

returninnerFn;

}

constclosure=outerFn();//这就是⼀个闭包

('返回的count',closure());

('返回的count',closure());

//输出结果:

//内部count0

//返回的count1

//内部count1

//返回的count2

根据结果看出:

可通过closure()来获取count的值

执⾏多次closure()时,count的值并不会被重置为0,⽽是持续叠加,证明outerFn内的私有变量count并不会随着执⾏closure()后被销毁。

闭包的运⽤

根据私有变量保护机制、且不易销毁的特性,可运⽤于缓存机制

//

ataBox=()=>{

letcache={};//缓存数据

letcacheKeys=[];//数据映射的key值

constmaxCacheCount=20;//为了防⽌内存溢出,规定最⼤缓存数据数量

return{

/*

*缓存数据

*key{string}映射数据的值

*data{any}需要缓存的数据

*/

tCache:(key,data)=>{

//判断key值是否已存在

if(keyincache){

cache[key]=data;

}el{

(key);

//判断已缓存的数据数量是否⼤于规定最⼤数量

if(>maxCacheCount){

constdelKey=();//删除第⼀个key,保持先进先出

deletecache[delKey];//删除对应的缓存数据

}

cache[key]=data;

}

},

/*

*获取映射缓存数据

*key{string}根据key值,获取映射的数据

*@return缓存数据|null

*/

getCache:(key)=>{

if(keyincache){

returncache[key];

}

returnnull;

},

/*

*清除映射缓存数据

*key{string}根据key值,清除映射的数据

*@return被清除的数据

*/

clearCache:(clearKey)=>{

if(clearKeyincache){

constkeyIndex=dex(val=>val===clearKey);//获取key值的下标

(keyIndex,1);//清除数组中的clearKey

constclearData=cache[clearKey];//保留被清除的数据,⽤于return

deletecache[clearKey];//清除对应的缓存数据

returnclearData;

}

returnnull;

},

/*

*获取全部缓存数据

*/

getAllCache:()=>{

returncache;

},

/*

*清除全部缓存数据,并返回全部缓存数据

*/

clearAllCache:()=>{

constcaCheData=cache;

cache={};

cacheKeys=[];

returncaCheData;

}

};

}();//⽴即执⾏匿名函数

封装好后,⼀般使⽤⽅法:

//

//缓存登陆信息

constajaxUr=newPromi((resove)=>{

//模拟接⼝请求

tTimeout(()=>{

resove({name:'李⼦玅',url:'/li459559937?spm=1011.2124.3001.5343'});

},3000);

});

//初始化数据

((data)=>{

he('urInfo',data);//缓存⽤户数据

});

//

//获取缓存的⽤户信息

consturInfo=he('urInfo');

('urInfo',urInfo);

//输出结果:

//urInfo{name:'李⼦玅',url:'/li459559937?spm=1011.2124.3001.5343'}

//

//⽤户登出,清除⽤户信息

ache('urInfo');

其他例⼦我就不写了,基本都涵盖在上⾯的例⼦中了。⽤法和原理都是差不多的。

具体可参考:

闭包的销毁

constouterFn=()=>{

letcount=0;

constinnerFn=()=>{

('count',++count);

}

returninnerFn;

}

letclosure=outerFn();//创建第⼀个闭包

closure();

closure();

closure=outerFn();//销毁第⼀个闭包,创建第⼆个闭包

closure();

closure();

closure=null;//销毁闭包

//输出结果:

//count1

//count2

//count1

//count2

由上⾯的例⼦可以看出来,当第⼆次为closure赋值后,再次执⾏2次closure()时,count的结果并不会变成3,4,⽽是⼜变回

了1,2。

这表⽰着,当第⼆次赋值的时候,第⼀个闭包就会被垃圾回收销毁掉,⽽第三次赋值为null时,则是把第⼆次的闭包也销毁了。

简单的总结:

关于闭包的销毁

可在模块或应⽤结束后来进⾏空赋值处理,进⾏销毁,⽐如上⾯的:closure=null

等待页⾯被关闭,才会被销毁。

⾄于为什么会要这么处理才会被销毁呢?具体的话可以⽹上找⼀下javascript回收机制,有兴趣的童鞋可以去了解了解。

题外话:缓存机制

既然前⾯有例⼦写到了缓存机制,那么也简单的了解⼀下。

对于缓存机制来说,也可以使⽤localStorage来实现,但是各有有缺点吧。

localStorage的优缺点

优点:

数据存于浏览器缓存中,可以同域名下,跨tab界⾯数据交互

存储时间长,关闭浏览器也不会被清除掉

存储⼤⼩可达5M

缺点:

任何数据储存后,都会被转化成字符串

⼿动清除浏览器缓存后就会被销毁

适合缓存简单型数据,单、多页⾯应⽤均可以使⽤

闭包的缓存机制

优点:

可以储存javascript的任何形态数据,且不会被转化

⼿动浏览器清除缓存也不影响

缺点:

⽆法跨tab界⾯数据交互

存储时间短,关闭tab页后就会被销毁

存在javascript内存中,缓存过多数据可能会影响性能,严重的导致内存溢出

适合:适合缓存少量复杂型数据,单界⾯应⽤

关于localStorage的使⽤请参考:

本文发布于:2023-01-01 16:04:05,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/72858.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:月攘一鸡
下一篇:patterned
标签:closure
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图