闭包答题技巧

208 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

曾几何时呢,一直不明白闭包问题到底应该怎么回答,有时候啊,人生就是这样抓不住重点。但是,今天不一样了,为了能弄明白闭包,那也是下了一些功夫的。现在检验一下呗! 如果对于作用域和作用域链不明白的,请移步 闭包前置知识点补充

闭包

首先,了解一下什么是闭包?

  • 既重用变量又保护变量不被污染的一种编程方法

今后:只要希望给一个函数,保存一个即可反复使用,又不会被外界污染的专属局部变量时,就用闭包

如何使用闭包

3步

  1. 用外层函数包裹要保护的变量和使用变量的内层函数
  2. 在外层函数内部返回内层函数对象
  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种东西:

  1. 外层函数——妈妈
  2. 外层函数的局部变量——红包
  3. 内层函数(多个)——孩子(们)

外层函数返回内层函数的方法:

  1. return
  2. 强行赋值为全局变量
  3. 将函数包裹在对象或数组中返回

二种情况:

  1. 妈妈一次生多个孩子: 多个孩子共用同一个红包!
  2. 妈妈反复生多次孩子:多次出生的孩子,拥有各自独立的红包,互不影响。

1.png

2.png

3.png

好了,闭包问题就写到这吧。下次遇到闭包的题,先分清楚妈妈、孩子和红包分别是代码中的哪一部分,然后根据两种情况进行解题吧!