国产黄色免费网站_久久天天做天天爱综合色_精品国产一区久久久_成人黄色激情网站_久久成人在线视频_美女一区二区在线观看_亚洲精品免费一区亚洲精品免费精品一区 _91精品国产综合久久精品麻豆

JavaScript操作符in:由一個(gè)問(wèn)題引發(fā)的探究

2021-4-13    前端達(dá)人

事情是這樣的:大家都知道“內(nèi)存泄露”這回事吧。它有幾個(gè)常見的場(chǎng)景:

  1. 閉包使用不當(dāng)引起內(nèi)存泄漏
  2. (未聲明的)全局變量
  3. 分離的DOM節(jié)點(diǎn)
  4. (隨意的)控制臺(tái)的打印
  5. 遺忘的定時(shí)器
  6. 循環(huán)引用

內(nèi)存泄漏需要重視,它是如此嚴(yán)重甚至?xí)?dǎo)致頁(yè)面卡頓,影響用戶體驗(yàn)!

其中第 3 點(diǎn)引起了我的注意 —— 我當(dāng)然清楚地知道它說(shuō)的是比如:“假設(shè)你手動(dòng)移除了某個(gè)dom節(jié)點(diǎn),本應(yīng)釋放該dom節(jié)點(diǎn)所占用的內(nèi)存,但卻因?yàn)槭韬鰧?dǎo)致某處代碼仍對(duì)該被移除節(jié)點(diǎn)有引用,最終導(dǎo)致該節(jié)點(diǎn)所占內(nèi)存無(wú)法被釋放”的情況

<div id="root"> <div class="child">我是子元素</div> <button>移除</button> </div> <script> let btn = document.querySelector('button') let child = document.querySelector('.child') let root = document.querySelector('#root') btn.addEventListener('click', function() { root.removeChild(child) }) </script> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

該代碼所做的操作就是點(diǎn)擊按鈕后移除.child的節(jié)點(diǎn),雖然點(diǎn)擊后,該節(jié)點(diǎn)確實(shí)從dom被移除了,但全局變量child仍對(duì)該節(jié)點(diǎn)有引用,所以導(dǎo)致該節(jié)點(diǎn)的內(nèi)存一直無(wú)法被釋放。

解決辦法:我們可以將對(duì).child節(jié)點(diǎn)的引用移動(dòng)到click事件的回調(diào)函數(shù)中,那么當(dāng)移除節(jié)點(diǎn)并退出回調(diào)函數(shù)的執(zhí)行上文后就會(huì)自動(dòng)清除對(duì)該節(jié)點(diǎn)的引用,自然也就不會(huì)存在內(nèi)存泄漏的情況了。(這實(shí)際上是在事件中實(shí)時(shí)檢測(cè)該節(jié)點(diǎn)是否存在,如果不存在則瀏覽器必不會(huì)觸發(fā)remove函數(shù)的執(zhí)行)

<div id="root"> <div class="child">我是子元素</div> <button>移除</button> </div> <script> let btn = document.querySelector('button') btn.addEventListener('click', function() { let child = document.querySelector('.child') let root = document.querySelector('#root') root.removeChild(child) }) </script> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

這段代碼很完美么?不。因?yàn)樗诿看问录|發(fā)后都創(chuàng)建了對(duì)child和root節(jié)點(diǎn)的引用。消耗了內(nèi)存(你完全可以想象一些人會(huì)狂點(diǎn)按鈕的情況…)。
其實(shí)還有一種辦法:我們?cè)赾lick中去判斷當(dāng)前root節(jié)點(diǎn)中是否還存在child子節(jié)點(diǎn),如果存在,則執(zhí)行remove函數(shù),否則什么也不做!

這就引發(fā)了標(biāo)題中所說(shuō)的行為。

怎么判斷?
遍歷?不,太過(guò)麻煩!
不知怎的,我突然想到了 for...in 中的 in 操作符,它可以基于原型鏈遍歷對(duì)象!

我們來(lái)還原一下當(dāng)時(shí)的場(chǎng)景:打開GitHub,隨便找一個(gè)父節(jié)點(diǎn),并獲取它:
mygithub
圖中畫紅框的就是我們要取的父元素,橘紅色框的就是要判斷是否存在的子元素。

let parent=document.querySelector('.position-relative'); let child=document.querySelector('.progress-pjax-loader'); 
  • 1
  • 2

這里注意,因?yàn)楂@取到的是DOM節(jié)點(diǎn)(類數(shù)組對(duì)象),所以我們?cè)诓僮髑耙欢ㄒ忍幚硪幌拢?br style="box-sizing:border-box;outline:0px;user-select:text !important;overflow-wrap:break-word;" /> object

let p_child=[...parent.children]; 
  • 1

array
然后

console.log(child in p_child); 
  • 1

not
!!!
為什么呢?(此時(shí)筆者還沒(méi)有意識(shí)到事情的嚴(yán)重性)
我想,是不是哪里出了問(wèn)題,用es6的includes API驗(yàn)證一下:

console.log(p_child.includes(child)); 
  • 1

yes
沒(méi)錯(cuò)啊!
再用一般的數(shù)組驗(yàn)證一下:
Verification
???
此時(shí),筆者才想起到MDN上查閱一番:
mdn
進(jìn)而我發(fā)現(xiàn):in操作符單獨(dú)使用時(shí)它檢測(cè)的是左側(cè)的值(作為索引)對(duì)應(yīng)的值是否在右側(cè)的對(duì)象內(nèi)部(屬性 & 原型上)

回到上面的代碼中,我們發(fā)現(xiàn):
vertification_2
這驗(yàn)證了我們的結(jié)論。
很顯然,“子元素”并不等同于“存在于原型鏈上” —— 這又引出了一個(gè)知識(shí)點(diǎn):attribute和property的區(qū)別

所以經(jīng)過(guò)一番“折騰”,源代碼還是應(yīng)該直接這樣寫:

<div id="root"> <div class="child">我是子元素</div> <button>移除</button> </div> <script> let btn = document.querySelector('button') let child = document.querySelector('.child') let root = document.querySelector('#root') let r_child = [...root.children] btn.addEventListener('click', function() { if(r_child.includes(child)){ // 或者你這里直接判斷child是否為null也可以...吧 root.removeChild(child) } }) </script> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17



















轉(zhuǎn)自:csdn論壇   作者:恪愚


藍(lán)藍(lán)設(shè)計(jì)www.newchinaweekly.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)



日歷

鏈接

個(gè)人資料

藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.newchinaweekly.com

存檔

色菇凉天天综合网| 欧美大交乱xxxxxbbb| 亚洲精品国产suv一区| 一二三四视频在线社区中文字幕2| 五月天色一区| 亚洲三区在线观看| 国产性生交xxxxx免费| 朝桐光av一区二区三区| 欧美日韩免费做爰视频| 国产成人久久精品77777综合| 69av视频在线| 99热这里只有精品1| 国产精品美女视频免费观看软件| 99免费在线视频| 国产一级黄色| 九色在线视频| 国产极品一区| 日韩在线观看| 国产成人av一区| 香蕉成人啪国产精品视频综合网| 久久婷婷国产综合精品青草| 亚洲国产综合人成综合网站| 亚洲男人天天操| 国产精品自拍视频| www.av毛片| 91麻豆精品久久毛片一级| 91影院在线播放| 狠狠操图片视频| 性欧美高清come| 国产成人av| 国产福利91精品一区| 欧美色播在线播放| 日韩中文字幕在线看| 国产无套精品一区二区| 亚洲视频一二三四| 亚洲自拍一区在线观看| 十大免费污污软件| 人人超在线公开视频| 日本精品三区| 欧美激情中文字幕一区二区| 亚洲高清在线观看| 成人自拍爱视频| 岛国av免费在线| 在线观看黄色网| 狠狠操天天操夜夜操| 欧美天堂视频| 日韩国产欧美在线播放| 欧美性猛xxx| 欧美最顶级的aⅴ艳星| 欧美日韩一道本| 国产性xxxx高清| 成年网址网站在线观看| 黑人巨大精品欧美一区二区桃花岛| 欧美综合影院| 国产日韩专区| 欧美日韩午夜激情| 国产精品91在线| 亚洲欧美手机在线| 亚洲精品.www| 免费a级在线播放| 欧美日本一区| 欧美日韩国产综合新一区| 国产91在线视频| 91香蕉视频免费看| 色噜噜在线播放| av大片在线| 日日夜夜精品视频天天综合网| 99re这里都是精品| 国产亚洲a∨片在线观看| 亚洲欧美精品| 日韩精品一区二区av| 黄色网址三级| 欧美日本成人| 亚洲成人av电影| 成人写真视频福利网| 成人免费毛片日本片视频| 欧美乱妇18p| 九九热线视频只有这里最精品| 在线日本制服中文欧美| 国产精品久久久久久久久免费相片| 欧美在线三级电影| 国产欧美一区二区在线播放| 免费精品在线视频| www.xxx黄| 成人精品电影| 黄色一区二区在线| 国产传媒第一页| 亚洲高清影视| 亚洲色偷偷综合亚洲av伊人| 日韩一区欧美小说| 亚洲综合国产激情另类一区| 久草国产在线观看| 久久777国产线看观看精品| 日本视频一区二区三区| 欧美最猛性xxxxx喷水| av动漫在线播放| 久久成人麻豆午夜电影| 99不卡视频| 久久99爱视频| 精品香蕉一区二区三区| 日本三级在线观看网站| av中文字幕网址| 欧美天天综合网| 麻豆国产欧美一区二区三区r| 性欧美视频videos6一9| 日韩高清一级| 欧美另类极品videosbest视| 无码精品人妻一区二区| 男人草女人视频| 欧美一区二区在线看| 91综合久久爱com| 色精品一区二区三区| 久久成人资源| 亚洲精品中文在线观看| 国产麻豆一区二区三区| 能看av的网址| 欧美 国产 日本| 欧美午夜理伦三级在线观看| 丁香花高清在线观看完整版| 一级黄色片在线看| 国产精品一区二区久久久| 国产精品一区二区x88av| 欧美色区777第一页| 亚洲精品国产av| 好吊色一区二区| 品天堂xxxx高清| 国产白丝一区二区三区| 精品久久久久久乱码天堂| 欧美日韩国产影院| 欧美成人高清视频在线观看| eeuss影院www在线观看| 麻豆国产欧美一区二区三区| 久久亚洲精品小早川怜子66| 99精品一区二区三区无码吞精| 波多野在线播放| 你懂的免费在线观看视频网站| 精品网站aaa| 欧美一区二区人人喊爽| 激情 小说 亚洲 图片: 伦| eeuss影院www免费视频| 亚洲影视综合| 日本精品久久久久影院| 国产精品第9页| 亚洲综合资源| 欧美一级高清片在线观看| 91欧美一区二区三区| 传媒在线观看| 极品美女销魂一区二区三区 | 4hu四虎永久在线影院成人| 毛片在线视频播放| 成人福利影院| 国产伦精品一区二区三区在线观看| 亚洲欧美激情在线视频| 国产白嫩美女无套久久| 1024视频在线| 亚洲一区二区在线免费观看视频| 国产欧美一区二区| 91精品国产乱码久久久| 日韩欧美在线精品| 色先锋资源久久综合5566| 日本中文字幕免费在线观看| 免费毛片b在线观看| 欧美日韩一区二区三区四区| 天天干天天色天天干| 中文字幕国产在线| 91色综合久久久久婷婷| 欧美性视频在线播放| 黄色动漫在线免费观看| 国产乱淫av一区二区三区| 国产传媒欧美日韩| 亲爱的老师6电影韩剧| 老鸭窝亚洲一区二区三区| 成人网中文字幕| 先锋资源一区| 老司机精品视频网站| 97中文在线| 国产在线第一页| 老司机精品视频导航| 精品国产福利| 黄色小视网站| 成人免费观看av| 一本二本三本亚洲码| 日本1区2区3区中文字幕| 国产精品天干天干在线综合| a√天堂在线观看| 日本大臀精品| 欧美日韩国产影院| 538国产视频| 国产精品毛片aⅴ一区二区三区| 狠狠躁夜夜躁人人爽天天天天97| 国产亚洲自拍偷拍| 欧美xx在线| 国产成人亚洲综合a∨婷婷 | 伊人久久综合一区二区| 日韩欧美中文字幕制服| 亚洲综合第一区| 久久porn| 国产精品久久久久久网站| 免费在线观看国产黄| 成人美女在线观看|