浅谈闭包


theme: geek-black

highlight: a11y-dark

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

前言

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

什么是闭包

  • 简单来说:
    • 闭包是创建私有变量的一种方式
    • 既能反复使用变量又能保证环境不被污染
    • 闭包也是一个对象
  • 简单的闭包 示例
    • 闭包要素:
      • 外部函数嵌套内部函数
      • 内部函数使用外部函数的变量

```js function fn() { var a = 2; return function () { a++; console.log(a) } }

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

为什么需要闭包

  • 维护一个私有变量,全局环境容易被污染
  • 内部函数能反复使用外部变量
  • 闭包除了有私有变量 还能维护私有方法

  • 牛刀小试:

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

count(1) // 1 // 如果有同事动了代码 // init = 0 // count(2) // 2 count(2) // 3 ```

  • 闭包版本
    • 将变量隐藏在内部 不受外部影响

```js function count() { var init = 0; return function (num) { init += num console.log(init) } }

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

怎么解决闭包的缺陷

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

js function fn() { var a = 1; console.log(a) } fn() // 1

1642661750(1).png

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

结语

  • 谢谢大佬们的阅读,如果觉得本文对你有帮助的话,留下个赞吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值