前言
JS之memoization,memoization 的原理是以參數(shù)作為 key,函數(shù)結(jié)果作為 value, 用對象進(jìn)行緩存起來,以內(nèi)存空間換 CPU 執(zhí)行事件。memoization 的潛在陷阱即是嚴(yán)格意義的緩存有著完善的過期策略,而普通對象的鍵值對并沒有。
用閉包進(jìn)行緩存的對象的內(nèi)存空間,不會在函數(shù)執(zhí)行完后被清除,在執(zhí)行量大和參數(shù)多樣性的情況下,會造成內(nèi)存占用且得不到釋放。
于是,本篇文章就來講講 JS 的垃圾回收。
JS 的垃圾回收機(jī)制的基本原理是:
找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存,垃圾收集器會按照固定的時間間隔周期性地執(zhí)行這一操作。
那我們怎么知道變量是不是在繼續(xù)使用呢?
首先,局部變量的生存周期是在函數(shù)聲明和執(zhí)行階段,函數(shù)執(zhí)行完畢后,局部變量就沒有存在的必要了。全局變量會在瀏覽器關(guān)閉或進(jìn)程關(guān)閉才能釋放。
但還有一些場景,比如閉包,通過作用域鏈訪問到函數(shù)外部的自由變量,使得自由變量保存在內(nèi)存中,不會隨著函數(shù)執(zhí)行完畢而結(jié)束,以及對象的相互引用等,垃圾收集器就沒這么容易判斷哪個變量有用,哪個變量沒用了。
// 經(jīng)典閉包 function closure() { var name = "innerName"; return function() { console.log(name); } } var inner = closure(); inner(); // innerName;