用閉包寫(xiě)一個(gè)Tab選項(xiàng)卡,為什么要用閉包以及閉包造成內(nèi)存泄露

直接上代碼吧!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{margin: 0;padding: 0;}
ul li{list-style: none;}
.box{width: 500px;height: 200px;margin: 0 auto;}
#tab{width: 498px;height: 48px;border: 1px solid #AAA;display: flex;justify-content: space-between;}
#tab li{font-size: 16px;line-height: 50px;}
#content{width:500px;height: 150px;background: burlywood;}
#content div{display: none;}
#content div:nth-child(1){background: red;}
#content div:nth-child(2){background: yellowgreen;}
#content div:nth-child(3){background: blue;}
#content div:nth-child(4){background: rebeccapurple;}
#content div:nth-child(5){background: yellow;}
#content .show{display: block;}
.active{background: #47c1f7;font-weight: 600;font-size: 22px;}
</style>
</head>
<body>
<div class="box">
<ul id="tab">
<li class="active">我是標(biāo)題一</li>
<li>我是標(biāo)題二</li>
<li>我是標(biāo)題三</li>
<li>我是標(biāo)題四</li>
<li>我是標(biāo)題五</li>
</ul>
<div id="content">
<div class="show">1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
</div>
<script>
var tab = document.getElementById('tab');
var li = tab.getElementsByTagName('li');
var content = document.getElementById('content');
var div = content.getElementsByTagName('div');

for (var i = 0;i<li.length; i++) {
    (function (j) {
        li[i].onclick = function () {
            for (var i = 0;i<li.length; i++) { //遍歷所有的li 隱藏
                li[i].className = '';    // i 所有的
                div[i].style.display = 'none';
            }
            // j 當(dāng)前的元素
            li[j].className = 'active';
            div[j].style.display = 'block'; //顯示當(dāng)前的元素
        }
    })(i);
}

</script>
</body>
</html>

為什么要使用閉包?
在javascript語(yǔ)言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,因此可以把閉包簡(jiǎn)單理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)”。所以本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。

閉包可以讀取函數(shù)內(nèi)部的變量,可以讓變量的值始終保持在內(nèi)存中。

因此會(huì)造成內(nèi)存泄露:內(nèi)存泄露不是內(nèi)存真正的泄露了,而是在使用閉包的過(guò)程中,閉包中的元素得不到釋放,元素占內(nèi)存越來(lái)越多,剩余越來(lái)越少,感覺(jué)像內(nèi)存泄露了一樣。

怎么解決這個(gè)問(wèn)題:
釋放元素,當(dāng)在應(yīng)用完這個(gè)元素過(guò)后,把值設(shè)置為 null
打破循環(huán)引用
添加另一個(gè)閉包
避免閉包自身

?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,774評(píng)論 1 45
  • 前端開(kāi)發(fā)面試題 <a name='preface'>前言</a> 只看問(wèn)題點(diǎn)這里 看全部問(wèn)題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 899評(píng)論 0 3
  • 陽(yáng)光投射十年前的照片 以冰棱為鏡 用五光十色向路人介紹 童年,土坯房,蟋蟀 還有過(guò)年時(shí)一桌平日里算得上奢侈的飯菜 ...
    姓蘇的貓閱讀 199評(píng)論 2 8
  • 此卦為今天早上的第二卦。卜流年,世爻為用,綜合卦象以及卦中動(dòng)爻分析吉兇。此卦世爻雖有余氣而旬空,卦中忌神帶月合,旺...
    易如人生閱讀 432評(píng)論 0 0
  • 時(shí)而心悵惘, 矛盾越重山。 身乃凡夫子, 世途瞧兩邊。
    海王星1984閱讀 160評(píng)論 0 0

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