首发地址: 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 原理