闭包
先来了解了解作用域
全局变量与局部变量
全局变量:全局执行环境创建,全局执行环境销毁随之销毁。
局部变量:写在函数中的变量。局部变量随着函数的执行产生,随着函数执行完毕销毁。
函数内部可以使用全局变量。
函数外部不能使用局部变量
闭包:指有权访问另外一个函数作用域中变量的函数。
闭包的形参:
1.函数嵌套函数
2.内部函数引用外部函数的变量或参数。
闭包的主要作用:延长变量的作用域
什么时候使用闭包:
当我们需要重复使用一个对象,又想保护这个对象不被其他代码污染的时候,就可以使用闭包。
闭包的缺点:
容易造成内存泄漏
内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪
费,导致程序运行速度减慢甚至系统崩溃等严重后果。
销毁闭包的内存空间:
将外部接收函数的变量重新赋值为null即可。
闭包的练习1(点击li标签弹出对应的下标。)
<body>
<!--
第一种:var 改成let
第二种:自定义属性
第三种:给节点添加属性
第四种:自执行+闭包
-->
<ul>
<li>选项1</li>
<li>选项2</li>
<li>选项3</li>
<li>选项4</li>
<li>选项5</li>
</ul>
<script>
var lis = document.querySelectorAll("li")
for (var i = 0; i < lis.length; i++) {
(function (i) {
lis[i].onclick = function () {
console.log(i);
}
})(i)
}
</script>
</body>
闭包的练习2(进入商品浏览页面,记录用户浏览的时间)
<body>
<!--
低级的实现方式:
因为我们定义了一个全局变量,用全局变量记录了浏览时间。
所有的编程语言几乎都有一个规范:尽可能的少的定义全局变量。
全局变量的缺点:
1.难控制。 因为全局变量在任何地方都可以读写,所以可能会被其他代码污染。
2.占用内存时间长。
-->
<script>
var timer = setInterval(browsTime,1000)
// 用户浏览时间
function browsTime(){
var timeNum = 0;
timeNum++;
console.log(timeNum+"秒");
if (timeNum == 5) {
clearInterval(timer);
}
}
</script>