JavaScript 以内存空间

首发地址: https://github.com/jeuino/Blo...

前言

在上一篇 《JavaScript 之做用域与做用域链》中,介绍了什么是做用域,以及变量和函数在做用域中是如何查找的。原来本篇文章是想写执行上下文中的变量对象的,可是想在介绍变量和函数是如何引用的以前,先总结一下它们是如何存储的。因此调整了一下发文顺序。

在 JavaScript 中,咱们常常会声明变量和函数,JavaScript 引擎在处理声明时,会在内存中开辟一块空间,用于存储变量或函数。那么变量和函数到底存储在哪里?咱们一块儿来看下。javascript

内存空间

Image  7

首先咱们须要了解几个概念:html

  • 栈内存(stack):栈内存中数据的存取方式为先进后出,后进先出。这个过程就像给枪上子弹,先上的子弹最后打出,后上的子弹先打出。

Image  8

  • 队列(queue):队列中的数据存取方式与栈正好相反,它是先进先出,后进后出。就像火车过山洞,火车头先进同时也是先出的,车尾后进后出。

Image  9

  • 堆内存(heap):堆内存中数据的存取是无序的,不须要像栈和队列同样,必须按照某种顺序进行。你只须要知道存储数据的地址,那么就能够根据地址随时将数据取出。就像书架同样,你只须要知道书名,就能够在书架上找到并取出。

那么 JavaScript 中声明的变量和函数是存储在哪里的呢?java

  • 基础数据类型(Undefined、Null、Boolean、String、Number):存储在栈中,按值访问。咱们能够经过 JavaScript 直接操做保存在变量中的值。。
  • 引用数据类型(Object):存储在堆中,按引用访问。堆中的数据是不容许经过 JavaScript 直接访问的,咱们平时在操做对象时,实际上操做的都是对象的引用(地址指针)。对象的引用存储在栈中。

咱们看下面的例子:git

var a = 0;
var b = 'test';
var c = {a: 1};
var d = [1,2,3];

Image  10

其中 a 和 b 两个基本数据类型数据存储在栈中;c 和 d 是引用类型,原始对象存储在堆中,并在栈中存储了引用地址。当咱们访问 c 和 d 时,都须要先从栈中获取引用地址,而后根据引用地址到堆中找到相应的对象。github

堆中原始的对象又是如何保存的呢?
堆中的原始的对象以字典结构保存,每个属性名都对应一个属性描述对象。上面例子中变量ca属性,其实是如下面的形式保存的:
Image函数

其中 [[value]] 属性保存的是该a属性的值。(其余的属性,咱们暂时不关注)
咱们再来看一个例子:ui

function foo() {
}
var obj ={
    foo: foo
}

这段代码中的 obj 对象是如下面的形式保存的:
Image  2this

其中,函数在堆中是单独存储的。
对象的属性值 foo,存储的实际上是该函数的引用地址。即便 foo 函数是直接定义在 obj 中的也是同样。严格来讲这个函数并不属于 obj 对象。spa

下一篇

下篇文章将接着上篇继续介绍执行上下文中的变量对象。3d

传送门:《JavaScript 之变量对象》

参考:

JavaScript 的 this 原理
相关文章
相关标签/搜索