久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

徹底理解js中的閉包

 instl 2018-11-27

閉包是js的一個(gè)難點(diǎn)也是它的一個(gè)特色,,是我們必須掌握的js高級(jí)特性,,那么什么是閉包呢?它又有什么用呢,?

我們都知道,,js的作用域分兩種,全局和局部,,基于我們所熟悉的作用域鏈相關(guān)知識(shí),,我們知道在js作用域環(huán)境中訪問(wèn)變量的權(quán)利是由內(nèi)向外的,內(nèi)部作用域可以獲得當(dāng)前作用域下的變量并且可以獲得當(dāng)前包含當(dāng)前作用域的外層作用域下的變量,,反之則不能,,也就是說(shuō)在外層作用域下無(wú)法獲取內(nèi)層作用域下的變量,同樣在不同的函數(shù)作用域中也是不能相互訪問(wèn)彼此變量的,,那么我們想在一個(gè)函數(shù)內(nèi)部也有限權(quán)訪問(wèn)另一個(gè)函數(shù)內(nèi)部的變量該怎么辦呢,?閉包就是用來(lái)解決這一需求的,,閉包的本質(zhì)就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。

 

我們首先知道閉包有3個(gè)特性:

①函數(shù)嵌套函數(shù)

②函數(shù)內(nèi)部可以引用函數(shù)外部的參數(shù)和變量

③參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收

 

本文我們以閉包兩種的主要形式來(lái)學(xué)習(xí)

 

①函數(shù)作為返回值

在這段代碼中,,a()中的返回值是一個(gè)匿名函數(shù),,這個(gè)函數(shù)在a()作用域內(nèi)部,所以它可以獲取a()作用域下變量name的值,,將這個(gè)值作為返回值賦給全局作用域下的變量b,實(shí)現(xiàn)了在全局變量下獲取到局部變量中的變量的值

再來(lái)看一個(gè)閉包的經(jīng)典例子

一般情況下,,在函數(shù)fn執(zhí)行完后,就應(yīng)該連同它里面的變量一同被銷毀,,但是在這個(gè)例子中,,匿名函數(shù)作為fn的返回值被賦值給了fn1,這時(shí)候相當(dāng)于fn1=function(){var n = 0 ... },,并且匿名函數(shù)內(nèi)部引用著fn里的變量num,,所以變量num無(wú)法被銷毀,而變量n是每次被調(diào)用時(shí)新創(chuàng)建的,,所以每次fn1執(zhí)行完后它就把屬于自己的變量連同自己一起銷毀,,于是乎最后就剩下孤零零的num,于是這里就產(chǎn)生了內(nèi)存消耗的問(wèn)題

 

再來(lái)看一個(gè)經(jīng)典例子-定時(shí)器與閉包

寫(xiě)一個(gè)for循環(huán),,讓它按順序打印出當(dāng)前循環(huán)次數(shù)

按照預(yù)期它應(yīng)該依次輸出1 2 3 4 5,,而結(jié)果它輸出了五次5,這是為什么呢,?原來(lái)由于js是單線程的,,所以在執(zhí)行for循環(huán)的時(shí)候定時(shí)器setTimeout被安排到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行,而在等待過(guò)程中for循環(huán)就已經(jīng)在執(zhí)行,,等到setTimeout可以執(zhí)行的時(shí)候,,for循環(huán)已經(jīng)結(jié)束,i的值也已經(jīng)編程5,,所以打印出來(lái)五個(gè)5,,那么我們?yōu)榱藢?shí)現(xiàn)預(yù)期結(jié)果應(yīng)該怎么改這段代碼呢?(ps:如果把for循環(huán)里面的var變成let,,也能實(shí)現(xiàn)預(yù)期結(jié)果)

 

引入閉包來(lái)保存變量i,,將setTimeout放入立即執(zhí)行函數(shù)中,將for循環(huán)中的循環(huán)值i作為參數(shù)傳遞,,100毫秒后同時(shí)打印出1 2 3 4 5

那如果我們想實(shí)現(xiàn)每隔100毫秒分別依次輸出數(shù)字,,又該怎么改呢?

在這段代碼中,相當(dāng)于同時(shí)啟動(dòng)3個(gè)定時(shí)器,,i*100是為4個(gè)定時(shí)器分別設(shè)置了不同的時(shí)間,,同時(shí)啟動(dòng),但是執(zhí)行時(shí)間不同,,每個(gè)定時(shí)器間隔都是100毫秒,,實(shí)現(xiàn)了每隔100毫秒就執(zhí)行一次打印的效果,。

 

②閉包作為參數(shù)傳遞

在這段代碼中,函數(shù)fn1作為參數(shù)傳入立即執(zhí)行函數(shù)中,,在執(zhí)行到fn2(30)的時(shí)候,,30作為參數(shù)傳入fn1中,這時(shí)候if(x>num)中的num取的并不是立即執(zhí)行函數(shù)中的num,,而是取創(chuàng)建函數(shù)的作用域中的num這里函數(shù)創(chuàng)建的作用域是全局作用域下,,所以num取的是全局作用域中的值15,即30>15,,打印30

 

最后總結(jié)一下閉包的好處與壞處

好處

①保護(hù)函數(shù)內(nèi)的變量安全 ,,實(shí)現(xiàn)封裝,防止變量流入其他環(huán)境發(fā)生命名沖突

②在內(nèi)存中維持一個(gè)變量,,可以做緩存(但使用多了同時(shí)也是一項(xiàng)缺點(diǎn),消耗內(nèi)存)

③匿名自執(zhí)行函數(shù)可以減少內(nèi)存消耗

壞處

①其中一點(diǎn)上面已經(jīng)有體現(xiàn)了,,就是被引用的私有變量不能被銷毀,,增大了內(nèi)存消耗,造成內(nèi)存泄漏,,解決方法是可以在使用完變量后手動(dòng)為它賦值為null,;

②其次由于閉包涉及跨域訪問(wèn),所以會(huì)導(dǎo)致性能損失,,我們可以通過(guò)把跨作用域變量存儲(chǔ)在局部變量中,,然后直接訪問(wèn)局部變量,來(lái)減輕對(duì)執(zhí)行速度的影響

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多