緩存是jQuery中的又一核心設(shè)計(jì),jQuery自身的很多東西都依賴(lài)于緩存,比如事件、一些中間變量、動(dòng)畫(huà)等。同時(shí)他還為用戶提供接口了使用緩存的接口,方便用戶在元素節(jié)點(diǎn)上保存自己的數(shù)據(jù),并且?guī)椭脩艚鉀Q直接把數(shù)據(jù)保存到DOM元素是可能引起的內(nèi)存泄漏、命名沖突等問(wèn)題。
同時(shí),html5提出了一種通過(guò)屬性緩存元素?cái)?shù)據(jù)的功能,就是data-*屬性,他可以以字符串的形式保存數(shù)據(jù),并且不會(huì)和元素固有屬性沖突。jQuery的緩存提供了訪問(wèn)data-*的接口,與html5標(biāo)準(zhǔn)結(jié)合更加緊密,更加規(guī)范。
提問(wèn):jQuery不同版本的緩存實(shí)現(xiàn)原理是什么?
答:jQuery1.x與jQuery2.x、jQuery3.x是不同的。
jQuery1.x系列中,需要兼容ie6、ie7等早期的瀏覽器,在ie6、ie7這樣的瀏覽器中,根據(jù)艾倫的博客,我們可以知道DOM元素與js對(duì)象相互引用,是會(huì)引起瀏覽器的內(nèi)存泄漏問(wèn)題。所以jQuery1.x中,最大的問(wèn)題是要防止在ie6、ie7瀏覽器上出現(xiàn)內(nèi)存泄漏。為了避免DOM元素與js對(duì)象相互引用而造成的內(nèi)存泄漏,jQuery必須從設(shè)計(jì)解決對(duì)象循環(huán)引用的問(wèn)題。所以jQuery1.x將需要緩存到元素上的數(shù)據(jù),統(tǒng)一保存到了一個(gè)公共存儲(chǔ)對(duì)象(jQuery.cache)中,jQuery.cache中的數(shù)據(jù)和緩存持有者之間再通過(guò)一uid關(guān)聯(lián)起來(lái)。這個(gè)uid是從1開(kāi)始自增的一個(gè)數(shù),同時(shí)再生成一個(gè)key(jQuery.expando)將這個(gè)uid保存在緩存所有者對(duì)象上。這樣元素對(duì)象就不會(huì)直接引用緩存的對(duì)象了,從而不會(huì)出現(xiàn)因循環(huán)引用而引起的內(nèi)存泄漏。