存储
在JavaScript中,有几种不同的内存存储方式,每种方式都有其特点和用途。以下是JavaScript中常见的内存存储方式:
1. 栈内存(Stack Memory)
- 特点:栈内存用于存储基本数据类型和函数调用。
- 存储内容:包括变量、函数调用、参数等。
- 特点:栈内存是一种有限的内存空间,遵循先进后出(FILO)的原则。
2. 堆内存(Heap Memory)
- 特点:堆内存用于存储复杂数据类型(对象、数组等)。
- 存储内容:包括动态分配的内存、对象、闭包等。
- 特点:堆内存是一种动态分配的内存空间,不受限于栈内存的大小。
3. 全局变量存储
- 特点:全局变量存储在全局作用域中,从程序开始到结束都存在。
- 存储内容:全局变量、全局函数等。
- 特点:全局变量会一直存在于内存中,直到页面关闭或手动释放。
4. 闭包存储
- 特点:闭包中的变量存储在堆内存中,因为闭包会保持对其词法作用域的引用。
- 存储内容:闭包中的变量、函数等。
- 特点:闭包可以访问其词法作用域中的变量,即使函数执行完毕也不会被销毁。
5. 原始值存储
- 特点:原始值(如数字、字符串、布尔值等)直接存储在栈内存中。
- 存储内容:原始值数据。
- 特点:原始值的大小固定,存储在栈内存中便于快速访问。
6. 函数代码存储
- 特点:函数代码存储在堆栈内存中,函数的作用域链和闭包环境存储在堆内存中。
- 存储内容:函数代码、作用域链、闭包环境等。
- 特点:函数的作用域链和闭包环境会在函数执行完毕后被垃圾回收机制回收。
联系
在JavaScript中,存在多种内存存储之间的联系
1. 栈内存(Stack)和堆内存(Heap)
- 联系:栈内存用于存储基本数据类型和函数调用,而堆内存用于存储复杂数据类型(对象、数组等)。
- 关系:栈内存中存储变量的值和引用,而堆内存中存储对象的实际数据。
2. 作用域链(Scope Chain)和闭包(Closures)
- 联系:作用域链定义了变量的访问规则,闭包是函数和其词法环境的组合,形成了闭包作用域。
- 关系:闭包中的变量通过作用域链与外部环境产生联系,使得函数可以访问外部作用域中的变量。
3. 原型链(Prototype Chain)和对象
- 联系:原型链是JavaScript中实现继承的机制,对象通过原型链与其原型对象产生联系。
- 关系:对象通过原型链继承原型对象的属性和方法,形成了对象之间的联系。
4. 全局环境和全局对象(Global Object)
- 联系:全局环境是整个JavaScript程序的最外层作用域,全局对象是全局环境中的对象。
- 关系:全局对象是全局环境的一部分,全局环境中定义的变量和函数都会成为全局对象的属性和方法。
5. 函数作用域和执行上下文(Execution Context)
- 联系:函数作用域定义了函数内部的变量访问规则,执行上下文包含了函数执行时的环境