美文网首页WEB前端程序开发WebWeb 前端开发
用闭包写一个Tab选项卡,为什么要用闭包以及闭包造成内存泄露

用闭包写一个Tab选项卡,为什么要用闭包以及闭包造成内存泄露

作者: 乱来丶Fack | 来源:发表于2018-07-27 11:46 被阅读7次

直接上代码吧!
<!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">我是标题一</li>
<li>我是标题二</li>
<li>我是标题三</li>
<li>我是标题四</li>
<li>我是标题五</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 当前的元素
            li[j].className = 'active';
            div[j].style.display = 'block'; //显示当前的元素
        }
    })(i);
}

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

为什么要使用闭包?
在javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包可以读取函数内部的变量,可以让变量的值始终保持在内存中。

因此会造成内存泄露:内存泄露不是内存真正的泄露了,而是在使用闭包的过程中,闭包中的元素得不到释放,元素占内存越来越多,剩余越来越少,感觉像内存泄露了一样。

怎么解决这个问题:
释放元素,当在应用完这个元素过后,把值设置为 null
打破循环引用
添加另一个闭包
避免闭包自身

相关文章

  • 用闭包写一个Tab选项卡,为什么要用闭包以及闭包造成内存泄露

    直接上代码吧! Title *{margin: 0;padding: 0;}...

  • javascript中的闭包

    闭包 基本概念 当 内部函数 被保存到 外部 时,将会一定生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。...

  • 闭包

    闭包就是内部的函数被保留到了外部 闭包会导致原有作用域链不释放,造成内存泄露。

  • 闭包

    闭包是一个非常强大的特性,但人们对其也有诸多误解。一种耸人听闻的说法是闭包会造成内存泄露,所以要尽量减少闭包的使用...

  • 什么是闭包?闭包的好处是什么?

    什么是闭包,闭包的好处 闭包 : 再函数外部可以访问函数内部的变量 好处: 坏处: 容易造成内存泄漏 闭包的相关应...

  • 函数

    封闭函数 用变量的方法定义函数 闭包 闭包存循环的索引值 闭包做私有变量计算器 闭包做选项卡

  • Python中的闭包

    什么是闭包?闭包有什么用?为什么要用闭包?今天我们就带着这3个问题来一步一步认识闭包。 闭包和函数紧密联系在一起,...

  • Python中的闭包

    什么是闭包?闭包有什么用?为什么要用闭包?今天我们就带着这3个问题来一步一步认识闭包。 闭包和函数紧密联系在一起,...

  • 前端笔记13

    封闭函数 用变量的方式定义函数 闭包 闭包存循环的索引值 闭包做私有变量计数器 闭包做选项卡 跳转原页面 获取地址...

  • 15day-封闭函数闭包

    封闭函数 用变量的方式定义函数 闭包 闭包存循环的索引 闭包做私有变量计数器 (6)闭包做选项卡 (8)跳转的源页面

网友评论

  • QG_d516:这里为什么要用闭包,和一般的循环有什么区别
    乱来丶Fack:不是为什么要用闭包写,而是用闭包举这个例子而已,其他的都可以啊
  • 乱来丶Fack:纯属个人理解观点,不喜勿喷

本文标题:用闭包写一个Tab选项卡,为什么要用闭包以及闭包造成内存泄露

本文链接:https://www.haomeiwen.com/subject/mqbwmftx.html