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 原理
相關文章
相關標籤/搜索