什么!!?都2023年了,还有人不知道闭包概念??

62 阅读2分钟

大家好!本小白初入前端行业,初探其窥境,这篇文章正是本小白来掘金的第一篇,下面就让我们来深层的解析一下闭包的概念!

白熊镇楼

微信图片_20230422205634.jpg

JavaScript 闭包的深层理解

闭包的背景

由于在 js 中只存在着两种作用域,分别是全局作用域和函数作用域(也可理解为局部作用域,模块作用域和块级作用域也是在匿名函数的作用域实现的)。而在开发的环境下,将变量暴露在全局作用域下的时候,是一件非常危险的事情,特别是在团队在协同一起开发的时候,变量的值就会无意间的被篡改,并且极其难调式分析。所以在这种情况下,闭包将变量封装在局部的函数作用域内,能大大避免此现象的发生,规避掉了被其他代码干扰的情况。

下面我就来简单的举几个例子来解释闭包怎么使用。

闭包的使用

下面是一个非常简单的闭包示例:

//妈妈本体
function mother(){
    //口袋里的总钱数
    let money = 100
    //消费行为
    return function (pay){
        //返回剩余钱数
        return money - pay
    }
}
//为儿子消费
let payForSon = mother()
//<code>打印最后的剩余钱数</code>
console.log(payForSon(5))

上述的代码可以简单理解为,我们将外部函数比喻为妈妈本体,里面保存着总前世这个变量和消费这个行为,通过创建为儿子消费的这个行为对象,让后执行这个行为花费了5元,返回剩余的95元。

这个就是为了将变量 money 保存在 mother 本体内而避免暴露在外部的全局作用域中,只能通过 mother() 这个方法来创建消费行为从而影响 money 这个变量。

由此可以归纳总结使用闭包的三个步骤

  1. 用外层函数包裹变量,函数;
  2. 外层函数返回内层函数;
  3. 外部用变量保存外部函数返回的内层函数

目的:为了形成一个专属的变量,只有专属的作用域中操作

上述的代码示例中,有一个缺陷场景,在后续不需要 money 变量的情况下,没有释放该变量,从而造成了内存泄漏。原因是 payForSon 这个函数的作用链引用着 money 这个对象。

解决办法:将 payForSon = null 就可以释放方法作用域,进而接触对 money 的引用,最后释放 money 变量。

介绍到这里各位小伙伴对这个知识点是否还有些许疑问,可以私信或者在文章下面留言哦~ 最后球球各位行业大佬的关注,鄙人也会持续更新质量优异的文章~~ 感谢米娜桑~~