第4章 变量、作用域和内存---JS红宝书书摘系列笔记

GitHub开源项目日报 · 2026年8月30日 · AI课堂与科研工具领跑开源热榜 本期榜单以 AI 应用开发工具为主,涵盖教学、科研、逆向工程、代码分析等多个领域。其中超过 10000 星的项目有 OpenMAIC、claude-scientific-skills、Archify、Heretic、Crawl4AI、last30days、Ghidra、Zod、FreeLLMAPI、LiveKit Agents、GitNexus 等,这些项目要么直击 AI 时代的内容生成痛点,如用多智能体一键生成交互课堂的 OpenMAIC、打包 163 个科研技能的 claude-scient 阅读详情

一、基本类型和引用类型

       ECMAScipt变量可能分为两种数据类型:基本类型和引用类型。

                基本类型:指简单的数据段;包括Undefined、Null、Boolean、Number、String;可以操作保存在变量中值(栈内存),所以称为按值访问;不能添加属性。

                引用类型:可能由多个值构成的对象;包括Arry、Object等;js不允许直接操作对象的内存(堆内存)空间,所以成为按引用访问;可以动态得添加/改变/删除引用类型值的属性和方法。

      1.复制

 1   var a=5;
 2   var b=a;
 3   console.log(a);//5
 4   console.log(b);//5
 5   a=3;
 6   console.log(a);//3
 7   console.log(b);//5
 8   var arrA=[1,2,3];
 9   var arrB=arrA;
10   console.log(arrA);//[1,2,3]
11   console.log(arrB);//[1,2,3]
12   arrA[0]='x';
13   console.log(arrA);//['x',2,3]
14   console.log(arrB);//['x',2,3]
   上述代码中a、b为基本数据类型,arrA、arrB为引用类型。可以看出首先定义并初始化了变量a为5,再定义变量b,此时打印出来a和b都是5;改变a的值为3,再次打印,a为3,b为5。对于引用类型arrA以及arrB,进行类似的操作,会发现arrA和arrB的值保持一致。继续看如下代码
1   var arrC=[1,2,3];
2   var arrD=arrC;
3   console.log(arrC);//[1,2,3]
4   console.log(arrD);//[1,2,3]
5   arrC=['X','Y','Z'];
6   console.log(arrC);//['X','Y','Z']
7   console.log(arrD);//[1,2,3]

        此时引用类型arrC、arrD的值并没有改变。这是因为基本类型是在变量对象上,而引用类型是保存在内存中。基本类型的变量是完全相互独立的,而引用类型变量的复制拷贝的实则上是一个指针,这个指针指向存储在内存中的对象。只要指针是指向改变的对象时,则通过这些指针访问的也会发生改变,如arrA、arrB。而arrC与arrD之所以前后没有保持一致,是因为arrC=['X','Y','Z']这个操作,是将arrC的指针指向了另一个对象,即['X','Y','Z']。而arrD的指针的指向并没有发生改变,仍然指向[1,2,3]。

       2.传递参数

          函数的参数传递是按值传递的,无论是基础类型还是引用类型。这一点书上说的很详细,可以参考书上P71页。

      3.检测类型

         typeof用来检测基本数据类型,instanceof用来检测引用类型。因为引用类型的值都是Object的实例,所以instanceof检测引用类型和object构造函数时返回true;反之instanceof检测基本类型时,由于基本类型不是对象,所以始终返回false。

二、执行环境及作用域

      Web浏览器中,全局执行环境被认为是window对象,所以所有全局变量和函数都是作为window对象的属性和方法创建的,不过一般省略了window。个人感觉这一小节内容还是比较容易理解的,执行环境就只分为两种:全局和局部。

     1.延长作用域链

        两种方法:try-catch和with语句。由于witch语句会给性能带来影响,所以以前者为例,catch语句会在作用域链的前端添加一个变量对象A,其中包含的是被抛出错误对象的申明,即在catch语句内部,可以引用对象A的属性或方法。

     2.JS语言没有块级作用域

        由于访问局部变量不用向上搜索作用域链,所以访问局部变量要比访问全局变量要快。即使快的不明显,但是仍然要尽量避免使用全局变量,防止变量污染。

三、垃圾收集

       JS具有自动垃圾收集机制,所需内存的分配以及无用内存的回收完全实现了自动管理。其原理是:垃圾收集器会按照固定的时间间隔周期性地找出那些不再继续使用的变量,然后释放其占用的内存。局部变量在函数执行完毕时会自动被销毁。

    1.JS垃圾收集方式有两种:标记清除和引用计数。

       前者最常用,简单来讲,垃圾收集器会给存储在内存中的所有变量加上标记,即进入执行环境的变量(占用内存)会被加上一个标记表示不会被清除;当变量要离开环境,执行完毕时,这些变量会再次被标记表示要被清除,此时环境中的变量已经访问不到这些变量。

       引用计数是指跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型赋值给该变量时,其引用次数为1,如果同一个值又被赋给另一个变量,则该值的引用次数家1;相反,如果包含对这个值引用的变量又取到另外一个值,则引用次数减1.当内存中值的引用次数为0时,其占用的内存空间会被回收。通俗来讲,引用次数就是指向内存对象的指针的个数。可以类比前面的arrC和arrD,如下图:

1 1   var arrC=[1,2,3];
2 2   var arrD=arrC;
3 3   console.log(arrC);//[1,2,3]
4 4   console.log(arrD);//[1,2,3]
5 5   arrC=['X','Y','Z'];
6 6   console.log(arrC);//['X','Y','Z']
7 7   console.log(arrD);//[1,2,3]

       首先内存中的值为[1,2,3],当声明arrC并将值[1,2,3]赋给arrC时,值的引用次数为1,即arrC的指针指向它。当将arrC的值赋给arrD时,值[1,2,3]的引用次数 1为2,此时arrC、arrD的指针都指向值[1,2,3]。接下来,将值['X','Y','Z']赋给arrC时,arrC的指针不再指向值[1,2,3],而是指向值['X','Y','Z'],此时arrD依旧指向值[1,2,3]。值[1,2,3]的引用次数减1为1。引用计数最大的弊端就是循环引用,即两个对象都包含指向对方的引用。

   2.性能问题

      垃圾收集器是周期运行的,时间间隔的确定会影响浏览器的性能。

  3.管理内存

     解除引用:将数据的值置为null,适用于大多数全局变量和全局对象的属性,其作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

团结引擎+OpenHarmony 2实战篇:从零构建鸿蒙应用开发环境 本文详细介绍了如何从零开始构建鸿蒙应用开发环境,重点讲解了团结引擎与OpenHarmony 2的实战配置步骤。内容包括DevEco Studio安装、OpenHarmony SDK配置、团结引擎集成及项目创建等关键环节,帮助开发者快速搭建高效的开发环境,提升鸿蒙应用开发效率。 阅读详情

相关推荐

热力学仿真软件:Fluent_(8).材料属性设置

在 Fluent 中,材料属性主要包括密度、比热容、导热系数、黏度等物理性质。这些属性在不同的仿真场景中有着不同的作用,例如在流体仿真中,密度黏度是必不可少的;在传热仿真中,导热系数比热容是主要考虑的因素。如果所需的材料不在材料库中,或者需要对现有材料进行修改,用户可以自定义材料属性。在主菜单中选择Materials。点击打开材料编辑器。在材料编辑器中,点击Create按钮,输入新的材料名称。选择材料类型(如FluidSolid等)。在属性栏中填写所需的材料属性。

kkchenjj的博客 1442

three js 9 补间动画tween

如果使用了yoyo的动画,且没有加delay,会有如下问题。AI给的解释为这是已知的bug。1 加上一个极短的delay。2 改用两个动画相互调用。

吴梓穆的博客 32

matlab_基于蜂窝网络的D2D通信的资源分配算法,主要是实现功率控制

matlab_基于蜂窝网络的D2D通信的资源分配算法,主要是实现功率控制

Babylon.js 9.0 完全解析 · 第 1 篇:光照系统三件套——Clustered Lighting、纹理面光源与体积光

Babylon.js 9.0 完全解析 · 第 1 篇:光照系统三件套——Clustered Lighting、纹理面光源与体积光

ttod的博客 366

从零到一: 创建一个 TypeScript 7 项目

本文介绍如何从零创建一个基于 TypeScript 7 的 Node.js 项目。项目使用 ECMAScript 模块 (ESM),并提供两条构建路径。TypeScript 编译器负责生成可发布文件,webpack 负责生成独立的 bundle。

除除的博客 184

GitHub 热榜项目:月榜(2026-08-31)

本期22个项目合计新增251,021星,AI智能体技能与记忆类工具集中上榜,方向覆盖提示词模板、团队记忆、代码代理控制面、图表生成与逆向安全路由。同时,pdf-inspector 提供本地PDF分类提取,OpenLogi 以无账号无遥测方式管理罗技外设,public-apis 继续集中免费API资源。多个项目呈现从一次性对话向可复用上下文资产迁移的取向。

u130130的博客 704

springboot开发高校选课管理系统:从零构建前后端分离的全栈实践

本文介绍了基于Spring Boot与Vue3+Element Plus的高校选课管理系统。系统覆盖课程管理、选课审核、成绩管理等核心业务,通过RBAC实现权限控制。其特点包括真实业务场景模拟、数据库优化设计及前后端分离架构,为全栈开发学习提供实践参考。

Json的知识梦工厂 480

hls.js 错误日志深度分析,前端 HLS 播放器问题定位实战

读懂 hls.js 输出的错误日志,是 Web HLS 播放器开发的必备能力。很多播放故障并不是前端播放器代码 bug,而是流媒体源、CDN、鉴权、分片损坏导致。借助网页调试工具做对照复现,结合 type、details、fatal 字段,能够快速划分故障责任边界,避免盲目修改前端代码做无效调试,大幅提升 HLS 业务问题排查效率。

2608_96729545的博客 331

线上Web异常发现为什么总是滞后?一套自研Web实时异常分析监控系统整体架构拆解

<think>我们根据要求,需要生成≤150字的文摘要。文内容是关于Web端实时异常分析监控系统设计,包括痛点、架构、能力等。摘要需要概括核心内容。注意字数限制。</think>本文围绕Web端实时异常分析监控系统,剖析线上异常排查滞后、复现难、数据割裂等痛点,对比现有方案局限,提出自研分层架构:客户端SDK采集、IndexedDB缓存、双通道上报,后端分析、告警与闭环。系统支持多维度分析、自定义告警、问题追踪,并明确适用边界。

weixin_42268042的博客 224

进阶实战-CloudStudio云IDE远程开发/云原生开发实战(一)

CSDN 发布信息(发布时填写,不显示):- 标题:云原生开发实战(一)| 完整远程开发闭环:本地同步 → 云端编码 → 一键部署云函数- 分类:云计算- 标签:CloudStudio、云函数、腾讯云、Serverless、云原生、远程开发、CodeBuddy。

2501_93047244的博客 307

第一课:DeepSeek Harness 到底是什么

<think>我们根据要求,生成≤150字的文摘要。摘要需概括内容:模型不等于Agent,Agent=模型+Harness;Harness是基础平台,Everything is Plugin,Cordis是插件内核;澄清模型、Tool、Plugin区别;提供安装实操路线,推荐先npm方式。尽量精简。</think>摘要:模型≠Agent,Agent=模型+Harness。DeepSeek Harness是组装Agent的基础平台,核心设计“Everything is a Plugi

2201_75538301的博客 303

最新大数据毕业设计选题推荐-基于大数据的电动汽车故障数据分析与可视化-大数据-Spark-Hadoop-Bigdata

<think>我们只需要根据用户提供的文内容生成≤150字的摘要。文主要介绍了一个基于大数据的电动汽车故障数据分析与可视化系统,包括技术栈、功能、背景、意义等。摘要应简洁概括核心内容。注意控制字数。</think>基于Hadoop与Spark的电动汽车故障数据分析可视化系统,融合Spring Boot、Vue、ECharts及MySQL,实现电池数据管理、故障概览与画像分析,以可视化看板呈现健康状态与风险趋势,为故障研判提供数据支撑,并具备技术迁移价值。

IT研究室的博客 301

JavaScript 异步编程

JavaScript 异步编程 异步的概念 异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。 在我们学习的传统单线程编程中

2601_96209748的博客 199

数据可视化:AI处理多维数据的HTML5可视化方案

在真实业务中,“多维数据”几乎无处不在:用户行为有几十个特征、传感器每秒上报几十个指标、推荐系统的特征向量动辄上百维。传统的二维图表(折线图、柱状图、散点图)最多只能同时编码 3~4 个维度,一旦维度超过 5 个,人类就很难从图表中直接读出结构规律。多维数据可视化的核心矛盾是:数据本身在高维空间遵循的分布规律,无法直接“摊平”到二维屏幕上,而信息损失又不可避免。因此,一个好的方案通常不是“画更复杂的图”,而是把流程拆成两步:本文会先对比主流 HTML5 可视化方案,再介绍 AI 处理多维数据的常用手段,最

2601_96493715的博客 341

C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板

<think>我们只需要生成一段不超过150字的摘要,基于用户给出的内容。摘要需涵盖单例模式演进、六种实现、关键问题等。要简洁。</think>单例模式是最高频设计模式,从C++98裸指针到C++11静态局部变量、call_once、智能指针,再到CRTP模板泛型,依次解决线程安全、内存泄漏与代码复用问题。新手宜用局部静态变量;服务端推荐智能指针删除器;大型框架适用CRTP通用模板单例。

2402_89341493的博客 316

three js 10包围盒

造成整个问题的原因是,这是一个蒙皮网格,网格实际上被骨骼放打了100倍,所以此时包围盒加上父级缩放(缩小100倍)反而不对了。需要注意的是,对于静态网格,乘以父级矩阵结果总是正确的,但是蒙皮网格则可能不对。原因是对于蒙皮网格,除了受父级缩放,还受骨骼影响,如果骨骼缩放不是1,则包围盒Mesh会不统一。然后在场景的打印的消息里,一直找子物体,直到找到mesh,然后找到他的名字,下图中名字是Object_10。这里的实际情况是,包围盒是正确的,但是蒙皮被骨骼放大了100倍,导致包围盒看起来很小。

吴梓穆的博客 97

VUE编程本地环境配置

VUE编程本地环境配置

u010112509的博客 163

JavaScript / TypeScript 易踩坑知识点完全指南 -假值(Falsy Values)完全指南

检查方式0''nullundefinedNaNfalse42'0'{}!

weixin_49523082的博客 289

从直接回显到安全编码:DVWA 反射型 XSS 模块完整漏洞分析教程

反射型 XSS(Reflected Cross-Site Scripting)是一种典型的跨站脚本攻击方式。攻击者将恶意脚本代码注入到 URL 参数中,当受害者点击包含恶意代码的链接时,服务器会将这段恶意代码原样反射到响应页面中并执行,从而达成攻击目的。整个过程无需持久化存储,攻击载荷随请求发出、随响应返回,因此得名“反射型”。1. 攻击者构造包含恶意脚本的 URL↓2. 通过钓鱼邮件、社交媒体等方式诱导受害者点击↓3. 受害者浏览器向服务器发送请求(携带恶意参数)↓。

2501_93881005的博客 342

vue学习(白话功能版)

用大白话讲明白vue

qq_43840793的博客 408
上一篇: JS常用的技术
下一篇: reveal.js让程序员做ppt也享受快乐
nqxcwl
博客等级 码龄19年 5粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值