大家好!本小白初入前端行业,初探其窥境,这篇文章正是本小白来掘金的第一篇,下面就让我们来深层的解析一下闭包的概念!
白熊镇楼
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 这个变量。
由此可以归纳总结使用闭包的三个步骤
- 用外层函数包裹变量,函数;
- 外层函数返回内层函数;
- 外部用变量保存外部函数返回的内层函数
目的:为了形成一个专属的变量,只有专属的作用域中操作
上述的代码示例中,有一个缺陷场景,在后续不需要 money 变量的情况下,没有释放该变量,从而造成了内存泄漏。原因是 payForSon 这个函数的作用链引用着 money 这个对象。
解决办法:将 payForSon = null 就可以释放方法作用域,进而接触对 money 的引用,最后释放 money 变量。
介绍到这里各位小伙伴对这个知识点是否还有些许疑问,可以私信或者在文章下面留言哦~ 最后球球各位行业大佬的关注,鄙人也会持续更新质量优异的文章~~ 感谢米娜桑~~