小白学闭包

69 阅读2分钟
什么是闭包

首先讲一个小故事:有一个被围起来的森林,森林里面有很多优质的资源,只有在里面的小动物可以享受到这个森林里面的资源,当然里面的小动物也可以享受外面的公共资源。但是外面的动物不能享受到里面的资源。一天森林里选举了一个管理员。从此这个森林有了一个通道,管理员每天在通道站岗,只要外面的动物找到管理员,那就可以享受里面的资源了

闭包就是函数内部和函数外部连接起来的桥梁,一般情况下函数的作用域是一个封闭的小盒子,函数内部可以使用外部的变量或方法,但是外部不能访问内部的变量和方法,函数执行完后,函数的作用域就会被删除。有了闭包后,只要通过闭包就可以访问函数内部的方法和变量,而闭包又相当于函数内的小区域,所以只要闭包不被销毁,函数就不会被销毁。(在JavaScript中,函数调用之后其变量对象本应该被销毁,但闭包阻止了它们的销毁,所以仍然可以访问函数的变量对象)

function addCalculator (x) {
    const add=function (y) {
        return x + y;
    }
    return add
}

var add1 = addCalculator(1);
console.log(add1(1)); //2
console.log(add1(3)); //4

add1 = null;// 释放对闭包的引用

上面的addCalculator函数就是一个小森林。而add就是选举的管理员。只要找到add,就可以访问到里面的资源了。这里内部资源就是x。当然森林通道可以有很多。管理员也可以有多个,如下代码

    var calculator = (
        function(){
            var a = 1;
            function addCalculator(val){
                a += val
            }
            return {
                add1:function() {
                    addCalculator(1);
                },
                add2:function() {
                    addCalculator(2);
                },
                result:function() {
                    return a
                }
            }
    })();
    console.log(calculator.result());  // 1
    calculator.add1();
    console.log(calculator.result());  // 2
    calculator.add2();
    console.log(calculator.result());  // 4

这三个公共函数是共享同一个环境的闭包,它们都可以访问 a变量和 addCalculator函数

闭包的优缺点
优点
  • 保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
缺点
  • 闭包会使得函数中的变量都被保存在内存中,所以滥用闭包的话会造成性能问题,在IE(IE9)之前可能导致内存泄露。
    解决方法:在退出函数之前,将不使用的局部变量全部删除(例如手动赋值为null)

望大家多多指教,多提意见,共同进步