• 【学习笔记67】JavaScript中的闭包


    一、认识函数的过程

    1. 定义

    1. 堆内存中开辟一段内存空间(XF001)
    2. 把函数体的内容,完全百分百的照抄一份,存放在内存空间中(XF001)
    3. 把内存空间的地址(XF001) 赋值给函数名

     2. 调用

    1. 根据函数名内存储的地址 (XF001)  ,去堆内存中找到对应函数
    2. 会去运行内存中, 开辟一段新的内存, 用于运行函数 (函数作用域)
    3. 形参赋值---预解析---函数代码全部执行结束
    4. 函数执行完毕之后, 这段内存空间会被销毁
    1. function fn() {
    2. let a = 100
    3. console.log(a)
    4. }
    5. fn()

    二、认识不会被销毁的内容空间

    1. 函数向外部返回了一个引用数据类型(返回的是引用数据类型的地址)

    2. 外部有一个变量接受这个返回值 (外部变量中有变量,拿到这个引用地址)

    3. 为了我们后续能够正常使用, JS 不会把这个函数的运行空间销毁

    1. function fn () {
    2. let obj = {
    3. a: 1,
    4. b: 2
    5. }
    6. return obj
    7. }
    8. let o1 = fn()
    9. console.log(o1)

     三、闭包

    •  重点:看清楚我们调用的是那个函数

    1、构成条件

    • 需要一个不会被销毁的函数执行空间
    • 需要直接或间接的返回一个函数
    • 内部函数使用外部函数的私有变量

    2、闭包的好处

    • 延长变量的作用域(使用时间)
    • 函数外部可以使用函数内部的变量

    3、闭包的弊端

    • 因为闭包的存在就一定代表一个函数执行空间不会被销毁, 如果大量使用闭包, 会导致内存空间占据严重

    4、代码实现

    1. function outer() {
    2. let a = 100
    3. let str = 'QF001'
    4. let obj = {
    5. a: 1,
    6. b: 2
    7. }
    8. function inner() {
    9. return a;
    10. }
    11. return inner;
    12. }
    13. // 1. 调用outer到内层函数inner, 存到了变量res中
    14. let res = outer();
    15. /**
    16. * 2. 调用res 也就是调用内层函数inner, 调用完成之后,因为函数内部return str,
    17. * 得到了一串字符串
    18. * 将这个字符串存储到了newStr这个变量中
    19. */
    20. let newStr = res();
    21. // 3. 打印newStr 得了outer函数中str变量
    22. console.log(newStr); // 100
  • 相关阅读:
    异步过渡方案—Generator
    C++第四次实验
    基于IMX8MPlus SMARC核心板的便携式床旁超声诊断仪应用解决方案
    力扣-412.Fizz Buzz
    32岁清华美女博导获奖百万,曾研制世界首台咽拭子采样机器人
    C#结合OpenCVSharp4图片相似度识别
    【微服务】一体化智慧工地管理平台源码
    详解CAN总线:什么是CAN总线?
    Xception实现动物识别(TensorFlow)
    Java -- 定时任务实现方式
  • 原文地址:https://blog.csdn.net/m0_58190023/article/details/128052121