12.闭包

60 阅读1分钟

当一个函数返回的是复杂数据类型,并且在函数外有变量函数的返回值,这个时候就会形成一个不会被销毁的函数执行空间,这个时候内部返回的函数就是闭包函数。

优点:
    延长变量的生命周期
    全局变量可以访问到局部变量
缺点:
    因为会有不会销毁的函数执行空间,可能会造成内存溢出(内存消耗)
**直接返回一个函数**
        //外层函数
        function outer() {
            let num = 100
            // 内层函数
            function inner() {
            return num
            }
            // 需要返回一个复杂数据类型
            return inner
        }
            调用函数
            let res = outer()
            // res 现在就是函数
            // 既然是函数就可以调用
            console.log(res);
            let result = res()
            console.log(result);
**间接返回一个函数**
        function outer() {
            var num = 200
            // 内层函数
            var obj = {
                // 对象中的值可以是函数
                setNum: (val) => {
                    num = val
                },
                getNum: function() {
                    return num
                },
            }
            // 需要返回一个复杂数据类型
            return obj
            }

闭包函数的应用

沙箱模式、沙箱模式的语法糖、柯里化函数。
**柯里化函数的封装**
    柯里化函数是内外层函数,一般外层函数用来传参,内层函数用来实现功能。
    function fn(a,b,c,d){
        return a+b+c+d
    }
    //开始封装
    function currying(fun,...arg){
        //fun是功能函数,是当参数的数量满足fun里面函数数量的要求之后,开始执行
        //arg是传进来的参数
        let _arg = arg || []
        let len = fun.length
        return function(...arg){
            _arg = [..._arg,...arg]
            if(_arg.length < len){
                return currying(fun,..._arg)
            }else{
                return fun(..._arg)
            }
         }
    }
    //将来要使用的时候
    let res1 = currying(fn,'http:','tianmao')
    console.log(res1);
    let res2 = res1('4444:', '/list.html')
    console.log(res2);