返回

JS红宝书拾遗(二):浅谈变量、作用域与内存

前端

从上一篇文章中,我们已经了解了JavaScript的基本数据类型,但变量存储值的本质是什么呢?

变量本质与存储

变量存储的值可以是原始值,也可以是引用值,从字面含义我们就可以知道,原始值就是值本身,存储在内存中,而引用值是对象的指针,存储的是对象在内存中的地址。

这就好比,我们把变量比作一个盒子,原始值就是盒子里的东西,而引用值就是写着东西存放地址的纸条。

需要注意的是,并非所有的值都是以原始值的形式存储,除了基本数据类型外,对象、数组、函数等都是引用值。

下表详细列出了 JavaScript 中的基本数据类型及其存储方式:

数据类型 值类型 存储方式
数字 数字 原始值
字符串 字符串 原始值
布尔值 布尔值 原始值
null null 原始值
undefined undefined 原始值
Symbol Symbol 原始值
对象 对象 引用值
数组 数组 引用值
函数 函数 引用值

作用域与执行上下文

作用域是指变量或函数可被访问的范围。在 JavaScript 中,作用域是词法作用域,这意味着变量的作用域由其声明的位置决定。

在 JavaScript 中,有两种主要的作用域:全局作用域和局部作用域。全局作用域是整个程序都可以访问的作用域,而局部作用域是函数内部的作用域。

执行上下文是 JavaScript 引擎用来执行代码的环境。每个执行上下文都有自己的作用域,并且执行上下文的栈是 LIFO(后进先出)结构。

当函数被调用时,一个新的执行上下文就会被创建,并且函数的作用域就会成为当前的执行上下文。当函数执行完毕后,其执行上下文就会被销毁。

内存管理与垃圾回收

JavaScript 使用一种称为标记清除算法的垃圾回收机制来管理内存。

标记清除算法首先会标记所有可达的对象。可达对象是指可以从全局作用域或其他可达对象访问到的对象。

标记完成后,垃圾回收器就会清除所有未被标记的对象。

JavaScript 的垃圾回收机制是自动的,我们无需手动管理内存。但是,我们可以通过一些方法来帮助垃圾回收器更好地工作,例如避免循环引用。

循环引用是指两个或多个对象相互引用,导致任何一个对象都无法被垃圾回收器回收的情况。

结语

变量、作用域和内存管理是 JavaScript 中非常重要的概念。理解这些概念对于写出高效、健壮的代码非常重要。

在本文中,我们已经介绍了 JavaScript 中的变量、作用域和内存管理相关知识,包括原始值与引用值、执行上下文、JS 垃圾回收机制。

希望本文对您有所帮助。