JS基础之闭包及递归

82 阅读1分钟

闭包

简而言之,闭包就是一个函数可以访问函数外面的变量,即: 函数 + 自由变量

    // 这是一个简单的例子:
    function add(){
        var x = 1
        function add1(){
            console.log(x) // 访问了外部的变量
        }
        return add1
     }
     var i = add()
     // 此时的 i() 就相当于 add() 也就是 add1()
     i() // 1

那么闭包有什么作用呢

1、避免全局污染,因为闭包使用的是局部变量
2、提供对局部变量的间接访问
3、维持变量使其不被垃圾回收

但当闭包使用不当后,会造成内存泄漏,举例说明:

    function Number(){}
    function closure(){
        var x = new Array(100000).fill(null).map(e=>new Number())
        return function inner(){
            return x
        }
    }
    // 函数由于被外部持有, 自身不会释放, 同时闭包也不会释放
    var fn = closure()
    // 此时 x 仍存在内存中,解决优化:
    fn = null

递归

程序不断调用自身的过程

举例说明:

    function fn(){
        fn()
    }
    fn()
    // 此时的 fn 就是一个递归函数,但会出现栈内存溢出

为了防止栈内存溢出,我们需要为递归设置条件:

1、设置递归的执行条件

    function fn(i){
        console.log(i)
        i += 1
        if(i<10){
            fn(i)
        }
    }
    fn(1) // 1 2 3 4 5 6 7 8 9

2、设置递归的结束条件

    function fn(i){
        console.log(i)
         i += 1
        if(i > 10) return;
        fn(i)
    }
    fn(6) // 6 7 8 9 10

练习:计算 1 + 2 + 3 + ..... + n 的和

    function sum(n){
       if(n === 1) return 1;
       return n + sum(n-1)
    }
    sum(6) // 21