码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JavaScript高级知识-闭包


    闭包的定义

    MDN的解释:

    • 一个函数和对其周围状态(lexical environment),词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure);
    • 也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域;
    • 在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

    在这里插入图片描述
    执行函数:
    在这里插入图片描述
    函数执行中:
    在这里插入图片描述
    执行完函数adder,但是由于adder5还引用函数adder,所以函数adder不会被回收,又因为函数adder的作用域链关联着函数createAdder,所以函数createAdder也不会被回收,这就是闭包的作用。
    在这里插入图片描述

    内存释放

    对于不再使用的闭包结构,我们需要及时释放内存。比如上述的案例,只需要将其赋值为null即可。
    adder5 = null

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
        <style>
        style>
    head>
    <body>
     
        <div>
            <button id="btn1">创建数组button>
            <button id="btn2">销毁数组button>
        div>
        <script>
            function createArray () {
                var arr = new Array(1024*1024).fill(1);
                return function () {
                    // arr 是上一层函数的变量,所以函数执行后不会销毁
                    console.log(arr);
                }
            }
            var totalArr = [];
            var createBtn = document.querySelector('#btn1');
            var destroyBtn = document.querySelector('#btn2');
            createBtn.onclick = function() {
                for (let i = 0; i < 100; i++) {
                    totalArr.push(createArray());
                }
            }
            destroyBtn.onclick = function() {
                totalArr = null;
            }
        script>
         
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    点击拍摄快照:
    在这里插入图片描述
    没创建数组之前的内存情况:
    在这里插入图片描述
    创建数组:
    在这里插入图片描述
    销毁数组:
    在这里插入图片描述
    我们可以看到,闭包使用完不及时清除,对内存的消耗还是挺大的。

    浏览器对内存的优化

            function createArray () {
                let name = '张三';
                let age = 18;
                const sex = '男'
                function test() {
                    debugger
                    console.log(name, sex);    
                }
                return test;
            }
            var demo = createArray();
            demo()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这个案例很明显是一个闭包的结构,但是我们发现浏览器并没有保存age这个变量。说明浏览器对此做了相关的优化,对于没有引用的变量进行清除。
    在这里插入图片描述

  • 相关阅读:
    Spring工具类--ReflectUtils的使用
    十二)Stable Diffussion使用教程:生成线稿
    java spring boot 字符串判空
    从零开始的Hadoop学习(六)| HDFS读写流程、NN和2NN工作机制、DataNode工作机制
    vs2022 编译遇见编译器堆空间不足,解决办法(针对CMAKE工程)
    Java基础学习笔记(七)—— 面向对象编程(3)
    代码随想录66——额外题目【回溯、贪心】:52N皇后II、649Dota2 参议院、1221分割平衡字符串
    code:blocks安装(最新详解版)
    深度学习-序列模型
    app分发推广有哪些技巧方法?信息传播对于app推广的方法总结分享
  • 原文地址:https://blog.csdn.net/weixin_43484007/article/details/127756973
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号