什么是闭包

202 阅读2分钟

什么是闭包

函数执行后返回结构是一个内部函数,并被外部变量所引用,如果内部函数持有被执行的作用的变量,即形成了闭包。
可以在内部函数访问到外部函数和的作用域。外部函数无法访问内部函数。为了保护变量不被污染,闭包会把函数中的变量存储在内存中。会对内存有消耗,因此不能滥用闭包,不使用闭包时,要及时释放内存

闭包的原理

函数执行分成两个阶段(预编译阶段和执行阶段)
    ·在预编译阶段,如果发现内部函数使用了外部的变量,则会在内存中创建一个闭包对象保存对应的变量值,如果已存在闭包,则只需要增加对应的属性即可。
    ·执行完毕后,函数执行上下文会被销毁,函数对闭包对象的引用也会被销毁,但其内部函数还持用改闭包的引用,所有函数可以用继续使用外部函数中的变量

利用了函数作用域链的特性一个函数内部定义的函数会将外部函数的活动对象加入到他的作用域链中,函数执行完毕作用域链销毁,但因内部函数的作用域链仍然在引用这个活动对象,所以所以其活动对象不会销毁,直到内部函数被烧毁后才销毁。

优点

1.可以从内部函数访问外部函数作用域中的变量,且访问到的变量长期驻扎在内存中,可供之后使用
2.可以避免变量全局污染
3.把变量独立到独立的作用域,作为私有成员存在

缺点

1.对内存消耗有负面影响,因内部函数保存了对外部变量的引用,导致无法被垃圾回收,增大了内存的使用量,会导致内存泄漏
2.对处理速度具有负面影响,闭包的层级决定了引用的外部变量子在查找时经过作用域链长度
3.可能会获取到意外的值

应用场景

模块封装,在各个模块规范出现之前,都是用这样的方式防止变量全局污染
```const closure = (() => {
    let foo = 0;
    closure(){}
    closure.prototype.bar = function bar(){
        return foo
    }
    return closure;
    
}())