1.什么是闭包?闭包的特点是什么?

闭包是一个函数,不过这个函数是声明在另外一个函数内部的,可以读取另外一个函数内部的变量。闭包其实非常常见,只不过可能我们很少意识到,这就是闭包。
闭包最大的特点就是可以记住自己的诞生环境,无论在何处调用,访问的都是声明时作用域的变量,可以访问到父函数中的变量,比如:

    function fn1() {
        var b=234;
        function fn2() {
            console.log(b);
        }
        return fn2;
    }
    var fn2=fn1();
    fn2();//234

此时,fn2就是一个闭包函数,由于js中的作用域是词法作用域,即函数的作用域是由函数的声明位置确定的,所以fn2fn1中声明的时候,它的作用域和作用域链就确定了,当fn2执行时,创建执行环境时,会根据作用域链向上逐级查找变量,最终在fn1中找到变量b,这就是为什么在外部调用fn2时,能够输出fn1b的值,也是为什么说闭包函数可以记住自己的诞生环境。

2.闭包函数的注意点

一般函数在执行完成后,其中的变量没有再被使用,内存就会被回收,
但是在闭包函数中,由于全局中的fn2一直被引用,所以fn1也不会被回收,变量b也会留在内存中。
因此,为了避免这种内存不被回收的问题,我们在使用完闭包函数fn2之后,要将闭包函数置空,切断引用关系,以实现回收fn1内存的目的

fn2=null;

此外,还有这一点值得注意的是,闭包函数的形成具有两个特点,一是声明在另一个函数内部,二是需要使用父函数的变量,二者缺一不可,所以

    function foo(){
        return function sub(){
        }
    
    }

以上并没有形成闭包,因为没有满足闭包形成的第二个条件。


forceddd
271 声望912 粉丝

一名前端爱好者。