闭包
1,了解函数
1-1,函数的定义过程
就是开辟一块空间,这个空间里面存的是函数里面代码的字符串形式,是不执行的,这块地址的空间给函数名
1-2,函数的执行过程
1 在函数调用的时候
2 另外开辟一块内存空间,这个内容空间叫做函数的"执行空间"
3 具体就是把函数名里面的代码复制一份到执行空间
4 进行形参赋值,预解析,代码执行
5 执行完成以后,该"执行空间"销毁
2,了解闭包
闭包的生成有三个必要条件
1 在函数A的内部直接或者间接返回一个函数B;
2 B函数的内部使用着A函数的私有变量;
3 A函数外部有一个变量接收返回的函数B;
+形成了一个不会被销毁的函数空间
闭包空间
我们管这个不会被销毁的A函数的执行空间叫做闭包空间
把A函数里面返回的B函数叫做函数A的闭包函数
官方的定义:闭包==>函数内部的函数
书写一个闭包
function a(){
var num = 1;
return function(){
num++;
console.log(num)
}
}
//面试第一题:
var b = a();//b就是return 的那个函数,也叫做a函数的闭包函数
b();//2
b();//3
b();//4
//面试第二题
var b1 = a();
var b2 = a();
var b3 = a();
b1();//2
b2();//2
b3();//2
b3();//3
b2();//3
3,闭包的特点
3-1,延长了变量的生命周期
优点:因为执行空间没有销毁,变量也没有销毁
缺点:因为执行空间不销毁,会一直存在内容中
3-2,可以访问函数内部的私有变量
优点:利用闭包函数可以访问函数内部的私有变量
缺点:执行空间不会被销毁,会一直存在内容中
3-3,保护私有变量
优点:保护私有变量不被外界访问
缺点:如果要访问,必须要利用闭包函数
3-4,闭包缺点和作用
**缺点:**因为当一段内存空间中有一个不会被销毁的东西一直存在,那么就会占用内存,如果过多,就会导致内存溢出,那么结果就是内存泄漏
**作用:**当你需要延长变量的生命周期的时候,当你要访问函数内部的私有变量的时候
3-5,闭包的应用场景
点击列表li标签,在不使用let声明的情况下,输出每个li在ul中对应的位置
<body>
<ul>
<li>第一个li</li>
<li>第二个li</li>
<li>第三个li</li>
</ul>
<script>
var liList = document.querySelectorAll('li');
for(var i = 0;i < liList.length;i++){
liList[i].onclick = (function(j){
return function(){
alert("点击的是第"+(j+1)+"个li标签");
}
})(i)
}
</script>
</body>