变量和作用域
基本类型和引用类型
- 基本类型按值访问,引用类型按引用访问。高程注解中说明当复制保存着对象的某个变量时,操作的是对象的引用;当为对象添加属性时,操作的是实际的对象。
- 基本类型的值在内存中占据固定大小的空间,所以被保存在栈内存中。引用类型的值是对象,保存在堆内存中。
- 引用类型的变量实际包含的是一个指针,指向堆内存中这个对象。
- 给基本类型添加属性时无效,尽管这样做不会导致错误。
1 2 3
| var name = 'james' name.age = 27 alert(name.age)
|
- 所有函数的参数都是按值传递。基本类型按值传递很好理解,引用类型稍微有些复杂,但对象也是按值传递的,这点毫无疑问。
1 2 3 4 5 6 7 8
| function setName(obj) { obj.name = 'james' obj = new Object() obj.name = 'greg' } var person = new Object() setName(person) alert(person.name)
|
上面例子可见,即使在函数内部修改了参数值,但原始的引用仍然保持没变。在 obj 内部重写时,这个变量引用的就是一个局部对象了,函数执行完毕后会被立即销毁。
管理内存
- 局部变量会在他们离开执行环境时被自动接触引用,但全局变量并不会,所以应该手动解除不再使用的对象及属性。
- 解除一个值的引用并不意味着自动回收该值所占用的内存,而是让值脱离执行环境,从而方便垃圾收集器在下次运行时进行回收。