JS中的闭包

70 阅读2分钟

引言

在面试中经常会被问到闭包,但是我对闭包其实还是感觉很陌生,那么什么是闭包呢?其实我们日常开发中经常用到闭包,只是我们没有意识到我们我们正在使用闭包,即便我们不知道闭包这个概念,我们也照样能使用闭包。

什么是闭包?

闭包是JS里的一种语法特性

var count = 1
function add() {
    count += 1
}

将上面代码放在非全局环境 里,它就是一个闭包了,闭包其实就是函数+自由变量(对于一个函数来说,变量分为:全局变量、本地变量、自由变量 )。那么,如何制造一个非全局环境呢?答案就是立即执行函数。

// 这里就是一个闭包
const fn = function () {
    var count = 1 // 自由变量
    function add() { // 函数
        count += 1
    }
}()

看到这里,有人会疑惑了,我听说闭包是函数套函数,然后return一个函数的。其实return函数是为了方便调用,不然函数内的函数也就没什么用了。

const fn = function () {
    var count = 1
    return function add() {
        count += 1
    }
}()

闭包的作用

  1. 提供对局部变量的间接访问(只能通过返回的函数去操作局部变量);
  2. 避免污染全局环境(因为用的是局部变量);
  3. 维持变量,使其不被垃圾回收。

闭包的缺点

闭包的缺点是使用不当的时候,有可能会造成内存泄露。闭包使用不当时,在某个版本的IE下会导致内泄露,这个是旧版本IE的bug导致的。

const fn = function () {
    var text = '我是很长的一段文字...'
    var count = 1
    return function add() {
        count += 1
        return count
    }
}()

var myFn = fn()
var myCount = myFn()

请问,上面代码的text会消失吗?正常情况下,text会被垃圾回收掉。但是旧版本的IE存在bug,导致text不会被垃圾回收,造成了内存泄露。

完。