JavaScript---变量内存分配

今天来看一下JavaScript在定义变量的时候是如何给变量分配内存的

ECMAScript变量包含两种类型:基本类型、引用类型

基本类型

定义:直接保存在栈内存中的简单数据段

包含:Undefined、Null、Boolean、Number和String,在内存中分别占有固定大小的空间,一般称他为按值访问。

引用类型

定义:保存在堆内存中的对象

包含:Object、Function、Array和自定义的对象。

变量中实际上保存的只是一个指向值的一个指针,这个指针指向内存中的另外一个位置,这个位置保存着值。该位置保存对象由于这种类型大小不固定(比如数组是可以动态增加的),不能保存在栈内存中,但是他们的内存地址是固定的,所以将地址存储在栈内存中,当查询引用类型的变量时,就先在栈内存中查询内存地址,然后找到保存在堆中的值。这种方式一般称为“按引用”访问,因为我们操作的不是实际值,而是被这个值引用的对象。


讲个例子和我的理解


JavaScript---变量内存分配_第1张图片
例子
输出结果

那么这里面的变量内存是如何变化的呢?

首先第一行,var a = "hello",b = "hi";

在栈内存中分配了两个内存,用来存储string类型的“hello”和"hi",假设“hello”的地址为100,“hi”的地址为101,那么变量a保存的值为“hello”的地址,也就是100;b保存的值为“hi”的地址,也就是101。

JavaScript---变量内存分配_第2张图片
变量a、b内存分配

执行函数exchange的时候内存变化:

JavaScript---变量内存分配_第3张图片
exchange函数内存变化

结束以后就可以看到a的地址为101,指向了“hi”,b和c的地址为100,指向了“hello”。然后console的时候就可以通过a和b的地址来找到栈中的值,然后就可以看到的结果:hi hello

额,上面好像错了,这里不应该直接用a和b,exchange的参数a和b和外面的a和b是两个不同的东西。但是意思还是那个意思。

最后执行的console输出的是hello hi 关系到变量范围,在这篇文章就不阐述了。

那么,“hello”什么时候被释放呢?这里面有一个计数器,记录有几个变量在指向或者应用到这个“hello”,当计数器变为0的时候,这个“hello”的内存就自动释放了。


个人理解,如果有错误,不当的地方。望指正!

最后贴出参考地址:http://www.cnblogs.com/purediy/archive/2012/09/12/2682482.html  感谢该博主

你可能感兴趣的:(JavaScript---变量内存分配)