浅谈闭包

2,664 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

前言

  • 大家好,我是前端沸人vike
  • 这篇让我们一起来了解闭包

什么是闭包

  • 简单来说:
    • 闭包是创建私有变量的一种方式
    • 既能反复使用变量又能保证环境不被污染
    • 闭包也是一个对象
  • 简单的闭包 示例
    • 闭包要素:
      • 外部函数嵌套内部函数
      • 内部函数使用外部函数的变量
function fn() {
    var a = 2;
    return function () {
        a++;
        console.log(a)
    }
}

fn()() // 3
console.log(a) // ReferenceError: a is not defined

为什么需要闭包

  • 维护一个私有变量,全局环境容易被污染

  • 内部函数能反复使用外部变量

  • 闭包除了有私有变量 还能维护私有方法

  • 牛刀小试:

    • 实现一个数字累加
      • 普通函数版本 如果更改全局变量 整个程序会造成影响
// 不使用闭包
var init = 0;
function count(num)  {
    init += num;
    console.log(init)
}

count(1) // 1
// 如果有同事动了代码
// init = 0
// count(2) // 2
count(2) // 3
  • 闭包版本
    • 将变量隐藏在内部 不受外部影响
function count() {
    var init = 0;
    return function (num) {
        init += num
        console.log(init)
    }
}

let a = count()
a(1) // 1
a(2) // 3

怎么解决闭包的缺陷

  • 闭包的取舍:
    • 在性能方面,闭包是较为消耗性能的,如果可以用其他方式解决的情况下,尽量不要使用闭包
  • 闭包会导致内存溢出 使用结束的变量不会被回收
  • 普通函数的回收
    • 函数在调用的时候才会创建本地作用域
    • 调用结束以后立即销毁本地作用域
function fn() {
    var a = 1;
    console.log(a)
}
fn() // 1

1642661750(1).png

  • 闭包的回收
    • 闭包在使用结束以后变量还存在内存中
    • 此时应该手动把变量设置为null 这样就会触发JS的垃圾回收机制

结语

  • 谢谢大佬们的阅读,如果觉得本文对你有帮助的话,留下个赞吧!