首發地址: https://github.com/jeuino/Blo...
在上一篇 《JavaScript 之做用域與做用域鏈》中,介紹了什麼是做用域,以及變量和函數在做用域中是如何查找的。原來本篇文章是想寫執行上下文中的變量對象的,可是想在介紹變量和函數是如何引用的以前,先總結一下它們是如何存儲的。因此調整了一下發文順序。
在 JavaScript 中,咱們常常會聲明變量和函數,JavaScript 引擎在處理聲明時,會在內存中開闢一塊空間,用於存儲變量或函數。那麼變量和函數到底存儲在哪裏?咱們一塊兒來看下。javascript
首先咱們須要瞭解幾個概念:html
那麼 JavaScript 中聲明的變量和函數是存儲在哪裏的呢?java
咱們看下面的例子:git
var a = 0; var b = 'test'; var c = {a: 1}; var d = [1,2,3];
其中 a 和 b 兩個基本數據類型數據存儲在棧中;c 和 d 是引用類型,原始對象存儲在堆中,並在棧中存儲了引用地址。當咱們訪問 c 和 d 時,都須要先從棧中獲取引用地址,而後根據引用地址到堆中找到相應的對象。github
堆中原始的對象又是如何保存的呢?
堆中的原始的對象以字典結構保存,每個屬性名都對應一個屬性描述對象。上面例子中變量c
的a
屬性,其實是如下面的形式保存的:函數
其中 [[value]]
屬性保存的是該a
屬性的值。(其餘的屬性,咱們暫時不關注)
咱們再來看一個例子:ui
function foo() { } var obj ={ foo: foo }
這段代碼中的 obj
對象是如下面的形式保存的:this
其中,函數在堆中是單獨存儲的。
對象的屬性值 foo,存儲的實際上是該函數的引用地址。即便 foo 函數是直接定義在 obj 中的也是同樣。嚴格來講這個函數並不屬於 obj 對象。spa
下篇文章將接着上篇繼續介紹執行上下文中的變量對象。3d
參考:
JavaScript 的 this 原理