JS——闭包

55 阅读1分钟

一、什么是闭包

定义:一个函数和对其周围的状态(词法环境)的引用捆绑在一起,这样的组合称为闭包;(mdn)

在js中,一个函数被创建的同时闭包也被创建了。(mdn)

闭包:
 function fnOut (){
        let a = 1;
        function fnIn() {
            console.log(a++)
        }
        return fnIn
    }
    const fn1 = fnOut()
    const fn2 = fnOut()
    fn1() // 1
    fn1() // 2
    fn2() // 1
    // 两次调用fnOut,创建了两个闭包,绑定了不同周围环境的引用,所以fn1和fn2的状态互不影响

二、闭包的作用

作用:

1、闭包可以让内部函数访问外部函数的作用域 。(mdn)

2、可以长久的保存一个局部变量

三、闭包会造成内存泄漏吗?

某些情况下会:比如使用了setInterval没有clear时,或者错误的创建了多个定时器,但只清除了最后一个定时器就会造成内存泄漏(内存泄漏:)

四、如何销毁闭包

只要不再保存这个函数的引用了,这个函数和函数所形成的闭包也就会被一并销毁 当状态不再被使用时,js会自动回收,比如使用了setTimeout设定的时间过了之后; 当使用setInterval,则会一直保持引用状态,需要手动清除定时器 ...

五、闭包一定是函数嵌套或一定要return内部函数吗

不一定,函数嵌套是实现闭包的一种常用方式;return内部函数是为了最外部作用域能够调用内部函数,并非闭包生成的必要条件

    以下同样是闭包,未函数嵌套、未返回函数:
     if (true){
        const a = 1;
        function fnIn() {
            console.log(a)
        }
        setTimeout(fnIn, 10000)
    }

参考文献:developer.mozilla.org/zh-CN/docs/… www.mk2048.com/answer/answ…