javascript
JS闭包的简单理解。优缺点以及垃圾回收机制
閉包是什么?
·了解閉包首先了解js的‘鏈?zhǔn)阶饔糜颉Y(jié)構(gòu),對(duì)象可以一級(jí)一級(jí)的向上查找父對(duì)象的變量,所以父對(duì)象的變量對(duì)子對(duì)象可見(jiàn),反之不成立;所以都可以訪問(wèn)全局變量
·為了解決函數(shù)外部無(wú)法訪問(wèn)函數(shù)內(nèi)局部變量的問(wèn)題,就在父函數(shù)中定義一個(gè)子函數(shù)并讓它訪問(wèn)了父函數(shù)的局部變量,再通過(guò)父函數(shù)返回該子函數(shù)就實(shí)現(xiàn)了調(diào)用局部變量的效果;
·而上面中的子函數(shù)就是閉包,所以閉包的定義是“能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)”,其實(shí)簡(jiǎn)單理解就是“一個(gè)定義在函數(shù)中的函數(shù)”;
示例
????? function parent(){ var a=1,b=2;???????? function child(){??????????? console.log(a+b);???????? }???????? return child;????? }????? var func1=parent(); //這是將子函數(shù)返回給變量????? func1();使用閉包有什么好處?
在內(nèi)存中維持一個(gè)變量,由于閉包,f1中的n只有通過(guò)f2方法訪問(wèn)到,無(wú)法通過(guò)其他途徑訪問(wèn)修改,從而達(dá)到了保護(hù)變量安全的效果;通過(guò)閉包實(shí)現(xiàn)了js私有屬性和私有方法的效果;
????function f1(){
????//閉包f2被外引用始終存在內(nèi)存中,而它所依賴的f1也會(huì)始終存在
????//所以n,m都是始終存在,刪除閉包直接f1=null;
????n=1,m=100;
????madd=function(){
????m+=10;
????alert(m);
????} ?//全局變量madd
????function f2(){
????n+=1;
????alert(n);
????}
????return f2;
????}
????var a=f1(); //將子函數(shù)返回賦值給了變量a
????a();
????madd();
????//madd的值是一個(gè)匿名函數(shù),同時(shí)是一個(gè)閉包,實(shí)現(xiàn)了外部對(duì)函數(shù)內(nèi)部進(jìn)行操作
????a();
使用閉包的注意點(diǎn):
·閉包會(huì)使函數(shù)中的變量一直存在內(nèi)存上會(huì)導(dǎo)致內(nèi)存消耗過(guò)大,所以不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)性能問(wèn)題,IE可能會(huì)造成內(nèi)存溢出。最好的方式是在退出閉包前將不必要的局部變量刪除。
·JavaScript垃圾回收機(jī)制,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC回收,如果兩個(gè)對(duì)象相互引用,而不再被第三方引用,那么這兩個(gè)對(duì)象會(huì)被GC回收,上述父函數(shù)被子函數(shù)引用,子函數(shù)又被外部c引用,這就是父函數(shù)不被回收的原因;
·作用域鏈時(shí)為了保證在執(zhí)行環(huán)境中有權(quán)訪問(wèn)的變量和方法是有序的,只能向上訪問(wèn),到window終止,即作用域鏈向下訪問(wèn)是不被允許的;
總結(jié)
以上是生活随笔為你收集整理的JS闭包的简单理解。优缺点以及垃圾回收机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 写了本机器学习入门书
- 下一篇: Easyui+Spring+Mybati