JavaScript 高级 内存管理和闭包

news2024/11/30 14:50:47

这里写目录标题

    • 1. JavaScript内存管理
    • 2. 垃圾回收机制算法
      • 1. 引用计数算法
      • 2. 标记清除算法
    • 3. 闭包的概念理解
    • 4. 内存泄露
    • 5. 面试题

1. JavaScript内存管理

不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,
某些编程语言会可以自动帮助我们管理内存

. 内存管理的生命周期

但是不管以什么样的方式来管理内存,内存的管理都会有如下的生命周期

  • 第一步:分配申请你需要的内存(申请)

  • 第二步:使用分配的内存(存放一些东西,比如对象等)

  • 第三步:不需要使用时,对其进行释放

不同的编程语言对于第一步和第三步会有不同的实现

手动管理内存:比如C、C++,包括早期的OC,都是需要手动来管理内存的申请和释放的

自动管理内存:比如Java、JavaScript、Python、Swift、Dart等,它们有自动帮助我们管理内存

对于开发者来说,JavaScript 的内存管理是自动的、无形的,我们创建的原始值、对象、函数……这一切都会占用内存,但是我们并不需要手动来对它们进行管理,JavaScript引擎会帮助我们处理好它

JavaScript会在定义数据时为我们分配内存

JS对于原始数据类型内存的分配会在执行时,直接在栈空间进行分配

JS对于复杂数据类型内存的分配会在堆内存中开辟一块空间,并且将这块空间的指针返回值变量引用

在这里插入图片描述
因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放,以便腾出更多的内存空间

在手动管理内存的语言中,我们需要通过一些方式自己来释放不再需要的内存,比如free函数,但是这种管理的方式其实非常的低效,影响我们编写逻辑的代码的效率,并且这种方式对开发者的要求也很高,并且一不小心就会产生内存泄露,所以大部分现代的编程语言都是有自己的垃圾回收机制

对于那些不再使用的对象,我们都称之为是垃圾,它需要被回收,以释放更多的内存空间,而我们的语言运行环境,比如Java的运行环境JVM,JavaScript的运行环境js引擎都会内存 垃圾回收器,垃圾回收器我们也会简称为GC,所以在很多地方你看到GC其实指的是垃圾回收器

2. 垃圾回收机制算法

1. 引用计数算法

当一个对象有一个引用指向它时,那么这个对象的引用就+1, 当一个对象的引用为0时,这个对象就可以被销毁掉,但是这个算法有一个很大的弊端就是会产生循环引用

2. 标记清除算法

标记清除的核心思路是可达性,这个算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找所有从根开始有引用到的对象,对于哪些没有引用到的对象,就认为是不可用的对象

JS引擎比较广泛的采用的就是可达性中的标记清除算法,当然类似于V8引擎为了进行更好的优化,它在算法的实现细节上也会结合一些其他的算法

事实上,V8引擎为了提供内存的管理效率,对内存进行非常详细的划分
在这里插入图片描述

3. 闭包的概念理解

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

一个普通的函数function,如果它可以访问外层作用域的自由变量,那么这个函数和周围环境就是一个闭包

  function f1(){
  
  }

从广义的角度来说:JavaScript中的函数都是闭包,从狭义的角度来说:JavaScript中一个函数,如果访问了外层作用域的变量,那么它是一个闭包

  function f1(){

    var n=999;

    function f2(){
      alert(n);
    }

    return f2;

  }

  var result=f1();

  result(); // 999

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。

所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

4. 内存泄露

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除

	var arr = new Array(1000).fill(1)
	// 使用完后
	arr = null

5. 面试题

 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()()); // The Window
 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()()); // My Object

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于融合C3SE+YOLOv5s的高精度二维码检测识别分析系统

在前面的系列博文中,我们尝试了在不同款的yolov5模型中加入不同的注意力机制来提升模型的性能,都有不错的表现效果,本文主要的目的是尝试将注意力机制融合集成进入原生的C3模块中来替换原生的C3模块来对比分析模型的检测性能,首先…

【精华】JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine(Java 虚拟机)的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言: 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言: 在遵循…

模块化建筑全球市场分析

模块化市场分析 市场摘要 全球模块化建筑市场,预计从2019年的1199亿6千万美元,到2027年的1916亿2千万,以6.4%的年复合成长率成长。人口增加,快速城市化和基础设施发展投资增加是预测期内刺激市场增长的关键因素。模块化施工是最可…

【C进阶】第十三篇——指针详解

指针的基本概念 指针类型的参数和返回值 指针与数组 指针与const限定符 指针与结构体 指向指针的指针与指针数组 指向数组的指针与多维数组 函数类型和函数指针类型 不完全类型和复杂声明 指针的基本概念 堆栈有栈顶指针,队列有头指针和尾指针,…

C++ 图进阶系列之纵横对比 Bellman-Ford 和 Dijkstra 最短路径求解算法

1. 前言 因无向、无加权图的任意顶点之间的最短路径由顶点之间的边数决定,可以直接使用原始定义的广度优先搜索算法查找。 但是,无论是有向、还是无向,只要是加权图,最短路径长度的定义是:起点到终点之间所有路径中权…

第五十讲:神州路由器IPv6隧道的配置

目前IPv6隧道技术有ISATAP隧道、6to4隧道、IPv6 over MPL隧道等。 任务一:配置ISATAP隧道 实验拓扑图如下所示 配置要求:两台路由器ROUTERA和ROUTERB通过IPv4网络连接,要求在两台路由器上分别配置ISATAP隧道,实现两端IPv6主机PC…

回收租赁商城系统功能拆解05讲-供货商

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零…

2022年学习和实习总结——收获颇多(未完待续...)

0 序言 时间已经进入了2023年,今年将是属于我们这一届秋招的一年。回顾2022年的学习和实习历程,我觉得今年的收获还是不少的,甚至可以说是整个高等教育生涯中,收获最多的一年。 1 学习情况总结 1.1 读书和学习总结 原来…

【Linux】项目构建自动化工具——make和makefile

make 和 makefile1.背景2. 利用make和makefile简单编译一个源文件3.使用方法解释4.执行原理5.项目清理1.背景 (1)一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定&#xff…

智能驾驶视觉传感器测试:自动驾驶车辆如何进行传感器标定?

为什么要进行标定?一辆自动驾驶车辆会安装多个传感器,需要通过传感器标定来确定相互之间的坐标关系,从而将多个传感器数据整合为“一个传感器”。因此,准确的传感器标定是实现智能车辆多传感器感知和定位系统的先决条件。传感器标…

MXNet的Faster R-CNN(基于区域提议网络的实时目标检测)《6》

我们在看Faster R-CNN源码(MXNet版本)的时候,除了下面这些我们遇到的常见的参数解析 import argparse import ast parser argparse.ArgumentParser(descriptionDemonstrate a Faster R-CNN network,formatter_classargparse.ArgumentDefaultsHelpFormatter) parse…

【操作系统系统/Golang】实验5:磁盘调度(FCFS,SSTF,SCAN与循环SCAN)

1 实验问题描述设计程序模拟先来先服务FCFS,最短寻道时间优先SSTF,SCAN和循环SCAN算法(对应其他参考书的LOOK和C-LOOK)的工作过程。假设有trackNum个磁道号所组成的磁道访问序列,给定开始磁道号initTrackNum和磁头移动…

Java项目管理工具:Maven介绍

Maven 简介下载与环境配置Maven仓库仓库类型本地仓库配置简介 Maven ,一款跨平台的项目管理工具。它主要服务于基于 Java 平台的项目构建与依赖管理。即可以将项目的开发和管理过程抽象成一个项目对象模型(POM),开发人员只需要做一些简单的配置,Maven 便可自动完成项目构建…

HRNet源码阅读笔记(4),庞大的PoseHighResolutionNet模块-stage1

一、图和代码上一讲的图中,有stage1图例如下;关键是看pose_hrnet.py中PoseHighResolutionNet模块的forward函数相关部分如下:def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self…

一辈子干好一件事,你就了不起

人生的道路和轨迹,就像是射出去的箭。假如左拐右拐,不但不能射中靶心,达不到目标,还有可能拐弯回到原点,原地踏步。日复一日,年复一年,没有成长和收获,这很可怕。 短暂的2022年&…

设计测试用例的万能公式 + 6大具体方法 = 面试就像聊天?

目录 一、设计测试用例的万能公式 二、设计测试用例的具体方法 2.1、等价类 2.2、边界值 2.3、判定表(因果图的另一种形式) 2.4、场景设计法 2.5、正交法(用的少,基本不可见) 2.4.1、使用allparis构建正交表 2.…

算法之动态规划理论

目录 前言 一个模型三个特征理论讲解 1.最优子结构 2.无后效性 3.重复子问题 一个模型三个特征实例剖析 两种动态规划解题思路总结 1.状态转移表法 2.状态转移方程法 四种算法思想比较分析 总结: 参考资料 前言 本篇博文主要讲解动态规划的理论&am…

行业分析| 交通综合执法对讲系统

随着社会的经济发展,人口的增加城市的不断壮大,城市交通情况越来越复杂,交警承担的执法任务越来越重,通信作为交警综合执法对讲调度的重要组成部分,也随之提出了更高的要求。综合执法对讲系统的出现使执法变得高效规范…

【Redis】高级进阶

🌟个人博客:www.hellocode.top🌟 🌟Java知识导航:Java-Navigate🌟 ⭐想获得更好的阅读体验请前往Java-Navigate 🔥本文专栏:《流行框架》 🌞如没有JavaWEB基础&#xff0…

【ZooKeeper】第三章 集群搭建

【ZooKeeper】第三章 集群搭建 文章目录【ZooKeeper】第三章 集群搭建一、ZooKeeper 集群介绍1.Leader 选举2.集群角色二、搭建 ZooKeeper 集群1.安装2.配置集群3.启动集群三、故障模拟一、ZooKeeper 集群介绍 1.Leader 选举 Serviceid:服务器 ID 比如有三台服务器…