今天来看一下JavaScript在定义变量的时候是如何给变量分配内存的
ECMAScript变量包含两种类型:基本类型、引用类型
基本类型
定义:直接保存在栈内存中的简单数据段
包含:Undefined、Null、Boolean、Number和String,在内存中分别占有固定大小的空间,一般称他为按值访问。
引用类型
定义:保存在堆内存中的对象
包含:Object、Function、Array和自定义的对象。
变量中实际上保存的只是一个指向值的一个指针,这个指针指向内存中的另外一个位置,这个位置保存着值。该位置保存对象由于这种类型大小不固定(比如数组是可以动态增加的),不能保存在栈内存中,但是他们的内存地址是固定的,所以将地址存储在栈内存中,当查询引用类型的变量时,就先在栈内存中查询内存地址,然后找到保存在堆中的值。这种方式一般称为“按引用”访问,因为我们操作的不是实际值,而是被这个值引用的对象。
讲个例子和我的理解
那么这里面的变量内存是如何变化的呢?
首先第一行,var a = "hello",b = "hi";
在栈内存中分配了两个内存,用来存储string类型的“hello”和"hi",假设“hello”的地址为100,“hi”的地址为101,那么变量a保存的值为“hello”的地址,也就是100;b保存的值为“hi”的地址,也就是101。
执行函数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 感谢该博主