JS红宝书拾遗(二):浅谈变量、作用域与内存
2024-01-26 10:32:23
从上一篇文章中,我们已经了解了JavaScript的基本数据类型,但变量存储值的本质是什么呢?
变量本质与存储
变量存储的值可以是原始值,也可以是引用值,从字面含义我们就可以知道,原始值就是值本身,存储在内存中,而引用值是对象的指针,存储的是对象在内存中的地址。
这就好比,我们把变量比作一个盒子,原始值就是盒子里的东西,而引用值就是写着东西存放地址的纸条。
需要注意的是,并非所有的值都是以原始值的形式存储,除了基本数据类型外,对象、数组、函数等都是引用值。
下表详细列出了 JavaScript 中的基本数据类型及其存储方式:
数据类型 | 值类型 | 存储方式 |
---|---|---|
数字 | 数字 | 原始值 |
字符串 | 字符串 | 原始值 |
布尔值 | 布尔值 | 原始值 |
null | null | 原始值 |
undefined | undefined | 原始值 |
Symbol | Symbol | 原始值 |
对象 | 对象 | 引用值 |
数组 | 数组 | 引用值 |
函数 | 函数 | 引用值 |
作用域与执行上下文
作用域是指变量或函数可被访问的范围。在 JavaScript 中,作用域是词法作用域,这意味着变量的作用域由其声明的位置决定。
在 JavaScript 中,有两种主要的作用域:全局作用域和局部作用域。全局作用域是整个程序都可以访问的作用域,而局部作用域是函数内部的作用域。
执行上下文是 JavaScript 引擎用来执行代码的环境。每个执行上下文都有自己的作用域,并且执行上下文的栈是 LIFO(后进先出)结构。
当函数被调用时,一个新的执行上下文就会被创建,并且函数的作用域就会成为当前的执行上下文。当函数执行完毕后,其执行上下文就会被销毁。
内存管理与垃圾回收
JavaScript 使用一种称为标记清除算法的垃圾回收机制来管理内存。
标记清除算法首先会标记所有可达的对象。可达对象是指可以从全局作用域或其他可达对象访问到的对象。
标记完成后,垃圾回收器就会清除所有未被标记的对象。
JavaScript 的垃圾回收机制是自动的,我们无需手动管理内存。但是,我们可以通过一些方法来帮助垃圾回收器更好地工作,例如避免循环引用。
循环引用是指两个或多个对象相互引用,导致任何一个对象都无法被垃圾回收器回收的情况。
结语
变量、作用域和内存管理是 JavaScript 中非常重要的概念。理解这些概念对于写出高效、健壮的代码非常重要。
在本文中,我们已经介绍了 JavaScript 中的变量、作用域和内存管理相关知识,包括原始值与引用值、执行上下文、JS 垃圾回收机制。
希望本文对您有所帮助。