本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
曾几何时呢,一直不明白闭包问题到底应该怎么回答,有时候啊,人生就是这样抓不住重点。但是,今天不一样了,为了能弄明白闭包,那也是下了一些功夫的。现在检验一下呗! 如果对于作用域和作用域链不明白的,请移步 闭包前置知识点补充
闭包
首先,了解一下什么是闭包?
- 既重用变量又保护变量不被污染的一种编程方法
今后:只要希望给一个函数,保存一个即可反复使用,又不会被外界污染的专属局部变量时,就用闭包
如何使用闭包
3步
- 用外层函数包裹要保护的变量和使用变量的内层函数
- 在外层函数内部返回内层函数对象
- 调用外层函数用变量接住返回的内层函数对象
//第1步:用外层函数包裹要保护的变量和使用变量的内层函数
function mother(){
var total=1000;
//第2步:返回内层函数对象
return function(money){
total-=money;
console.log(`花了${money}还剩${total}元`)
}
}
//第3步:调用外层函数用变量接住返回的内层函数对象
var pay=mother();
//pay接住的是mother()返回出来的内层函数对象
pay(100);//应该剩900
total=0;//别人程序的代码
pay(100);//应该剩800
- 外层函数是妈妈
- 内层函数是宝宝
- 外层函数的局部变量是妈妈给宝宝包的专属红包
- 调用外层函数妈妈,生了小宝宝,小宝宝拿着属于自己的红包,自立门户!
到底什么是闭包
- 闭包也是一个对象
- 闭包就是每次调用外层函数时,临时创建的函数作用域对象。
- 为什么外层函数作用域对象能留下来?因为被内层函数对象的作用域链引用着,无法释放。
一句话概括:闭包如何形成———-外层函数调用后,外层函数的作用域对象,被返回的内层函数的作用域链引用着,无法释放,就形成了闭包对象
闭包缺点
由于闭包藏得很深 几乎找不到 所以,极容易造成内存泄漏!
如何释放不用的闭包对象?
将保存内层函数对象的变量赋值为null 导致函数名变量与内层函数对象分开
闭包答题技巧
找3种东西:
- 外层函数——妈妈
- 外层函数的局部变量——红包
- 内层函数(多个)——孩子(们)
外层函数返回内层函数的方法:
- return
- 强行赋值为全局变量
- 将函数包裹在对象或数组中返回
二种情况:
- 妈妈一次生多个孩子: 多个孩子共用同一个红包!
- 妈妈反复生多次孩子:多次出生的孩子,拥有各自独立的红包,互不影响。
好了,闭包问题就写到这吧。下次遇到闭包的题,先分清楚妈妈、孩子和红包分别是代码中的哪一部分,然后根据两种情况进行解题吧!