【JavaScript】变量、作用域和内存问题

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

以下内容整理自《JavaScript高级程序设计(第四章)》

1 基本类型和引用类型的值

基本类型值是简单数据段,引用类型值是多个值构成的对象。

基本数据类型:Undefined、Null、Boolean、Number、String。

对于引用类型值,可以对其添加属性和方法,而基本类型值不支持该操作。

基本类型值的复制是在新变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。而复制引用类型值时,同样会将存储在变量对象中的值复制一份到为新变量分配的空间中,不过这个值实际是一个指针,而这个指针指向存储在堆中的一个对象。

ECMAScript中所有函数的参数都是按值传递的,基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。访问变量有按值和按引用两种方式,而参数只能按值传递。

typeof操作符是确定一个变量是字符串、数值、布尔值、还是undefined的最佳工具,如果变量的值是一个对象或null,则typeof操作符会返回object。在检测引用类型值时,为了知道值是什么类型的对象,ECMAScript提供了instanceof操作符,其语法如下:

result = variable instanceof constructor

如果变量是给定引用类型的实例,那么instanceof操作符会返回true。

2 执行环境及作用域

执行环境(execution context,简称“环境”)定义了变量和函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。

每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。

当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象(activation object)作为变量对象。活动对象在最开始只包含一个变量,即argument对象(该对象在全局环境中不存在)。作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。

执行环境的类型只有全局和局部(函数),部分语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除,当执行流进入下列任何一个语句时,作用域链就会得到加长:

  1. try-catch语句的catch块;
  2. with语句。

这两个语句都会在作用域链前端添加一个变量对象。对with语句来说,会将指定的对象添加到作用域链中;对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

JavaScript没有块级作用域,使用var声明的变量会自动被添加到最接近的环境中,如果初始化变量时没有使用var声明,该变量会自动被添加到全局环境。

当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么,搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。

3 垃圾收集

垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存。用于标识无用变量的策略通常有两种。

JavaScript中最常用的垃圾收集方式是标记清除(mark-and-sweep),垃圾收集器在运行时会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间。

另一种不太常见的垃圾收集策略叫做引用计数(reference counting)。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值的引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,就会释放那些引用次数为0的值所占用的内存。

引用计数策略面临一个问题:循环引用。循环引用指的是对象A中包含一个指向对象B的指针,而对象B中也包含一个指向对象A的引用。因此必须在不使用值的时候将引用手动置为null,这样就切断变量和它引用的值之间的连接。当垃圾收集器下次运行时,就会删除这些值并回收它们占用的内存。

优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null来释放其引用——这个做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动被解除引用。

手把手教你为Multisim 14.0创建自定义元件:以SPICE模型导入为例 本文详细介绍了如何在Multisim 14.0中创建自定义元件,重点讲解了SPICE模型的导入与应用。通过系统性的步骤指南,包括元件符号设计、引脚定义、SPICE模型关联及验证测试,帮助工程师高效扩展元件库,满足特定设计需求。文章还提供了故障排除和性能优化的实用技巧,确保自定义元件在实际仿真中的可靠性。 阅读详情

相关推荐

Windows 11 24H2 外接显卡坞兼容性实测:3步解决USB设备失效

本文详细解析了Windows 11 24H2系统下外接显卡坞导致USB设备失效的问题,并提供了三步终极解决方案:驱动预解压与手动更新、电源管理设置调整、优化的设备连接顺序。通过雷电3接口的兼容性优化,帮助用户解决键盘鼠标卡死等常见问题,提升外接显卡坞的稳定性与性能。

weixin_31714129的博客 587

重学js之JavaScript变量、作用域和内存问题

注意: 本文章为 《重学js之JavaScript高级程序设计》系列第四章【变量、作用域和内存问题】。 关于《重学js之JavaScript高级程序设计》是重新回顾js基础的学习。 1. 基本类型和引用类型的值 ES变量包含两种不同数据类型的值:基本类型值和引用类型值。 将一个值赋给变量的时候,解析器必须确定这个值是基本类型还是引用类型 1.1 基本类型值 指的是那些保存在栈内存中的简...

执行上下文的博客 161

文件上传漏洞攻击与防范方法

文件上传漏洞攻击与防范方法 文件上传漏洞简介: 文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。 文件上传漏洞危害: 上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者上传...

m0_38103658的博客 4万+

JavaScript中的变量、作用域、和内存问题

前言 最近开始入坑js“圣经”之一的《JavaScript高级程序设计》,准备深入学习这门“博大精深”的语言,下面我学习第四章的总结及拓展。 目录 变量 js中声明变量的几种方式 var:可以声明任意类型的变量,js会根据变量的值来自动判定这个值是什么类型 function:主要是声明函数类型的变量,如定义一个函数 啥也不加直接写变量 下面是es6声明变量的方式 let:和var作用一样...

老曹的博客 260

【回归预测】GRNN广义回归神经网络-MATLAB

广义回归神经网络(GRNN)是一种基于径向基函数(RBF)的神经网络模型,主要用于非线性回归任务。与传统的回归分析方法相比,GRNN具有更强的非线性映射能力和学习速度,能够快速逼近复杂的非线性关系。输入层、模式层、求和层和输出层。输入层接收输入数据,模式层通过径向基函数将输入映射到高维空间,求和层对模式层的输出进行加权求和,最后输出层生成预测结果。GRNN的核心思想是利用高斯核函数计算输入与训练样本之间的相似度,然后根据相似度加权平均得到预测值。

2303_77200324的博客 1091

Win11下DCMTK的Visual Studio 2022配置教程

最近有个新需求,需要完成读取和解析DICOM数据相关的SDK

qq_45797625的博客 3261

JS变量,作用域,和内存问题

4.JS变量,作用域和内存问题 1.基本类型和引用类型的值; ECMAScript 变量可能包含两种不同的数据类型的值:基本类型值和引用类型值。 基本类型值为简单的数据段,而引用类型值为由多个值构成的对象。 在将一个值赋值给变量时,解析器必须确定这个值时基本类型还是引用类型的值。 例如简单的五种基本类型的值:undefined,null,number,string,boolean, 这五种时基本类...

qq_43955202的博客 318

WSL2 + Open3D点云可视化踩坑全记录:从GLFW报错到VcXsrv配置,一篇讲清所有‘坑’

本文详细解析了在WSL2环境中使用Open3D进行点云可视化时遇到的常见问题,特别是GLFW报错和VcXsrv配置问题。通过系统性的解决方案和高级配置技巧,帮助开发者彻底解决图形显示、驱动加载和库版本冲突等难题,实现高效的点云可视化。

weixin_30627341的博客 101

JS高程 Chp.4 变量、作用域和内存问题 思维导图

mdjfk的博客 219

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 884

Rerender A Video 技术浅析(四):跨帧约束

时间一致性是指在视频处理过程中,保持相邻帧之间内容、风格和运动的平滑过渡,避免出现视觉上的不连续性或伪影。时间一致性跨帧约束模块的主要目标是在视频增强、风格迁移等任务中,确保处理后的视频在时间维度上保持一致性和稳定性。该模块主要通过以下几种方式实现时间一致性:1.时序损失(Temporal Loss):最小化相邻帧之间的差异,确保帧间内容的平滑过渡。2.循环一致性损失(Cycle Consistency Loss):确保帧间转换的一致性,避免出现风格漂移。3.

m0_75253143的博客 1480

JavaScript学习4-JS变量、作用域和内存问题

4.1 基本类型和引用类型值        1.基本类型按值来访问的,因为可以操作保存在变量中的实际值;       引用类型的值是按引用来访问的,引用类型的值保存在内存中的对象,js不允许直接访问内存中的位置,也就        是说不能直接操作内存的空间。操作对象实际是操作的对象引用而非实际的对象。       java等很多语言,字符串以对象的形式来表示,因此被认为是引用类型,而ES放

wkj的博客 385

【KingSCADA】如何建立硬件系统及相关变量

本篇主要讲解如何定义设备,如何定义变量。KingSCADA3.8的采集系统是指负责和现场设备进行通讯,并采集现场数据和控制现场数据的模块,称之为采集器,也叫IOServer应用,它是一组独立的应用程序,可以脱离KingSCADA3.8软件,它依赖于KingSCADA3.8驱动产品,通过驱动与IO设备进行通讯。采集系统由通讯链路,设备,数据块组成。链路:链路是指计算机通过什么方式(接口)与设备进行连接,链路类别:串口,以太网,GPRS,Modem,通信卡,采集卡,无链路。

做有价值的事,积累有价值的笔记! 1万+

JavaScript变量作用域和内存问题(js高级程序设计总结)

1,变量 ECMAScript和JavaScript是等同的吗?个人认为是否定的。我的理解是这样的,ECMAScript是一套完整的标准或者说协议,而JavaScript是在浏览器上实现的一套脚本语言。也就是说,ECMAScript是JavaScript的父类标准。JavaScript是ECMAScript的具体实现。所有ECMAScript定义的数据类型或者语言特性实际上...

bacheyu9657的博客 119

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Javascript 中变量、作用域和内存问题

Javascript 中变量、作用域和内存问题 JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自以下5种基本数据类型:Undefined、Null、Boolean、Number和String。基本数据类型值和引用数据类型值具有以下特点: 基本类型值在内存中占据固定大小的空间,因此保存在栈内存中; 从一个变量向另一个变量复制基本类型的值,会创建这一个值得副...

weixin_43895989的博客 212

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JavaScript变量、作用域和内存问题思维导图

一一 264

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《javascript高级程序教程》第四章总结——JS变量,作用域和内存问题

1.基本类型与引用类型(J:基本类型标识,Y:引用类型标识)基本类型:Undefined,Null,Boolean,Number,String。引用类型:Object1.1复制变量值J 基本类型之间复制变量值为创建新值:var num1=5; var num2=num1; num2=3; alert(num2); //3 alert(num1); //5num1与num2相互独立,当num2被赋值...

食梦虫的博客 327

js变量、作用域和内存问题的复习**

基本类型和引用类型 基本类型指的是简单的数据段,引用类型指那些可能由多个值构成的对象。引用类型的值是保存在内存中的对象。在实际操作中,实际上是在操作对象的引用而不是实际的对象,因此引用类型的值是按引用访问的 js变量的访问有按值和按引用两种,而参数的传递是按值传递的 s所有函数的参数都是按值传递的,也就是把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。基本类型值的

sqliang的专栏 1317

JavaScript中变量、作用域和内存问题

title: JavaScript中变量、作用域和内存问题 categories: JavaScript tags: JavaScript LearningNote JavaScript学习笔记。 Github同步链接: click here 变量、作用域和内存问题 基本类型和引用类型的值 JavaScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值。 基本类型值指的是简单的数据段 引用类型值指的是那些可能由多个值构成的对象 引用类型的值是保存在内存中的对象。JavaSc.

StriveZs'Blog 367

JavaScript的变量、作用域和内存问题

基本类型和引用类型的值 引用类型的值是保存在内存中的对象。与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。 string类型不是对象 动态的属性 对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。 不能给基本类型的值添加属性,尽管这样

lisiur的博客 496

javascript变量、作用域和内存问题

1-基本类型和引用类型的值 1.1、基本数据类型值:Undefined、Null、Boolean、Number和String; 1.2、引用数据类型值:Object 2-复制变量 2.1、变量赋复制基本数据类型值 2.2、变量复制引用类型值 2.2.1、基本类型的值是直接存储在栈里面的,而引用类型的值是存储在堆里面。 2.2.2、由于js不允许直接操作对象的内存空间,所以在操作对象时,实际上是在操作对象的引用而不是实际的对象。 2.2.3、引用对象复制其实是复制了该对象的指针,而这个指针指向存储在堆中的一

weixin_45174032的博客 363

JavaScript变量作用域和内存问题

首先由于JavaScript的变量不同于其他语言,JavaScript变量属于松散类型,本质决定了他只是一个在特定时间内保存特定值的一个名字而已,也就是说变量的值和变量的数据类型都可能会在脚本的生命周期内改变。 基本类型和引用类型的值 ECMAscript变量可能包含两种不同数据类型的值。(基本类型 和 引用类型) 基本类型:简单的数据段(Undefined Null Boolean Number String) 引用类型:可能由多个值构成的对象。Objuect 首先我们知道,我们的变量是...

weixin_45888120的博客 290

《JavaScript高级程序设计》第4章 js中的变量、作用域和内存问题

《JavaScript高级程序设计》第4章变量、作用域和内存问题 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。 函数的参数都是按值传递的。 typeof操作符: 是确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具,但是对引用类型来说就无能为力了。

Gyoung杨广 309

javascript 变量、作用域和内存问题

一、基本类型和引用类型的值 1.基本类型和引用类型的值 基本类型值:指那些保存在栈内存中的简单数据,即这种值完全保存在内存中的一个位置,他们所占据的空间大小是固定的。 引用类型值:指那些保存在堆内存中的对象,这些类型的真正数据是保存在堆内存中的,而同时在栈内存中保存的只是一个指针,这个指针指向的是这个对象在堆内存中的一块地址。 基本类型的复制:基本类型在内存中占有的...

a835039783的博客 155

javaScript高级程序设计(第三版)-第四章 变量、作用域和内存问题

前面三章都是基础,所以直接跳过。 1、变量 由于javaScript是一个弱语言,表明变量的值及其数据类型可以在脚本的生命周期内改变,可以随意变来变去。其中变量包含的数据类型可以分为两类:基本类型和引用类型。 基本类型:Number String Booler nudifind null固定大小,存在栈内存中。直接引用值,是复制一个副本 引用类型:[] {} 不是固定大小...

weixin_33716557的博客 140

JavaScript中变量,作用域和内存问题

变量,作用域和内存问题 学习重点: 1.理解基本类型和引用类型的值 2.理解执行环境 3.理解垃圾回收 JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变。 1.基本类型和引用类型的值 ...

Alisane的博客 363
上一篇: 解决npx @electron-forge/cli import时提示缺失依赖
下一篇: 【剑指 Offer】重建二叉树
includei
博客等级 码龄9年 406粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值