闭包的特点&&闭包面试题

闭包的特点(优点和缺点并行)

            1 延长了变量的生命周期
                + 优点:因为执行空间不销毁,变量也就没有销毁

                + 缺点:因为执行空间不销毁,会一直存在内存中

            2 可以访问函数内部的私有变量
                + 优点:利用闭包函数可以访问函数内部的私有变量

                + 缺点:执行空间不会销毁,会一直存在内存中 

            3 保护私有变量(只要是函数就有这个特点)
                + 优点:保护私有变量不被外界访问

                + 缺点:如果想访问,必须要利用闭包函数 

闭包函数的缺点"致命

            + 因为当一段内存空间中有一个不会被销毁的东西一直存在

            + 那么就会出现内存占用,如果过多,就会导致内存溢出

            + 那么结果就是内存泄漏

闭包的作用

            + 就是当你需要延长变量的生命周期的时候

            + 或者你需要访问某一个函数内部的私有变量的时候

            + 你可以使用闭包函数来解决

            + 前提:

                ==>如果有别的办法,尽量不使用闭包函数

                ==>只有到没有招的时候,我们再使用闭包函数

            + 闭包:慎用

例子:内存泄漏

            + 比如说你有一个盆,能装2L水

            + 你向里面正常导入2L水,是没有问题的

            + 假如这个盆里面被"闭包"占据了0.5L的空间

            + 你向里面正常导入2L的水,那么就会有一部分漏出来了

例子:进程和线程

            + 进程 ==> 基于操作系统的概念

                ==>能够独立分配一段内存空间来运行的

            + 线程 ==> 在进程内部开放出来的处理问题的通路    



            + 进程 ==> 一个公园里面有一个公共厕所,就是一个进程

                ==>再修建一个公共厕所,就是两个进程

            + 线程 ==>一个公共厕所的坑位

                ==>只有一个坑位的就叫单线程(js)

            + 异步

                ==>大家都排队上厕所

                ==>突破排到你了,但是你是一个异步的

                ==>那么就把你拿出来排到队尾

                ==>等到同步的人上完,再让你上

闭包例子解析

function a(){
           var num = 200;
           return function b(){
                console.log(num)
           }
       }
       // 可以访问函数a内部的私有变量
       // console.log(num);
       // 报错,没有这个变量
       // 因为num是函数a的私有变量,在函数内部可以访问
       // 在函数外部不能访问函数内部的私有变量

       var res = a();
       // res接收到的是a函数内部返回的函数b
       // res执行的时候,执行的一句话就是console.log(num)
       // 当函数b内部访问num变量的时候
       // 如果自己没有,就会去b函数的父级作用域查找
       // b函数的父级作用域就是a函数的执行空间
       // 里面有一个num变量可以被访问
       // 就能打印出200
       res()

闭包面试题

function fn() {
            var num = 1;
            return function () {
                num++;
                console.log(num)
            }

        }
        // 第一题
        var res = fn();
        res();//打印的是几  2
        res();//打印的是几  3
        res();//打印的是几  4
        res();//打印的是几  5


        // 第二题
        var res1 = fn();
        var res2 = fn();
        var res3 = fn();
        res1();//打印的是几  2
        res2();//打印的是几  2
        res1();//打印的是几  3
        res3();//打印的是几  2

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值