闭包

172 阅读3分钟

闭包

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>