not a better man

前端技术

闭包

上图代码是go语言闭包的写法,当一种编程语言引入了闭包的思想,那么我们就知道

  • 该编程语言函数肯定是一等公民(就是函数可以作为参数,可以作为返回值)
  • 函数内部可以定义函数 

什么是闭包

我们从上面得知,闭包肯定与函数有关,一种说法是,闭包是引用了自由变量的函数,这个自由变量将和该函数一同存在,即使离开创建它的环境也还存在。这种说法是指明闭包是一个函数。还有一种说法:闭包是由函数和与其相关的引用环境组合而成的实体  。这两种各有各的说法 。但是闭包保证能够在函数内部调用自由变量,而函数外部无法访问到该自由变量。

闭包解决了什么问题

闭包让我们模块化编写代码更加方便,减少了全局变量的使用,使用自由变量变量内存常驻。在 js 中我们可以使用闭包的思想模拟私有变量。如下面的代码

function create_counter(initial) {
    var x = initial || 0;
    return {
        inc: function () {
            x += 1;
            return x;
        }
    }
}

我们无法才从外部访问x 变量,模拟了私有变量。

闭包的开销

函数中的局部变量是存储在栈中,当时函数执行完,函数出栈,释放栈空间,局部变量也清空掉。但是闭包的中自由变量和返回的函数体地址是存储在堆中的,如果一个程序闭包创建的过多,而没有释放,会导致无用的对象存储在内存中,导致内存泄漏,并且GC遍历过程时间增长,导致程序中断的时间过长。在使用的过程中需要考虑。

发表评论