函數(shù)防抖

這是一個(gè)簡單的函數(shù)防抖問題,和同事解釋的是利用作用域鏈來存儲(chǔ)內(nèi)部匿名函數(shù)的變量,但問起為什么外部函數(shù)可以存儲(chǔ)變量而不會(huì)被釋放內(nèi)存,我就去查了下瀏覽器的垃圾收集機(jī)制。


image.png
   常用的是引用計(jì)數(shù)清除和標(biāo)記清除,由于引用計(jì)數(shù)存在循環(huán)引用問題(兩個(gè)對(duì)象互相引用,無法清除),現(xiàn)在大多數(shù)瀏覽器才用的是標(biāo)記清除,標(biāo)記清除的核心是‘對(duì)象是否可以獲得’,定期找所有從根(全局對(duì)象)開始引用的對(duì)象,然后找這些對(duì)象引用的對(duì)象 。。。從根開始,垃圾回收器將找到所有可以獲得的對(duì)象和收集所有不能獲得的對(duì)象。
 由于debounce返回的匿名函數(shù)被‘document.getElementById('input').oninput’引用,同時(shí)debounce又被匿名函數(shù)引用,所以debounce函數(shù)中的變量不會(huì)被垃圾回收機(jī)制清除。

最后發(fā)現(xiàn),debounce函數(shù)和內(nèi)部的匿名函數(shù)形成了一個(gè)明顯的閉包(有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù)),這就解釋了為什么要慎重使用閉包。因?yàn)殚]包會(huì)占用過多的內(nèi)存,并且需要手動(dòng)清除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容