变量和作用域

变量和作用域

基本类型和引用类型

  • 基本类型按值访问,引用类型按引用访问。高程注解中说明当复制保存着对象的某个变量时,操作的是对象的引用;当为对象添加属性时,操作的是实际的对象。
  • 基本类型的值在内存中占据固定大小的空间,所以被保存在栈内存中。引用类型的值是对象,保存在堆内存中。
  • 引用类型的变量实际包含的是一个指针,指向堆内存中这个对象。
  • 给基本类型添加属性时无效,尽管这样做不会导致错误。
1
2
3
var name = 'james'
name.age = 27
alert(name.age) //undefined
  • 所有函数的参数都是按值传递。基本类型按值传递很好理解,引用类型稍微有些复杂,但对象也是按值传递的,这点毫无疑问。
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) //'james'

上面例子可见,即使在函数内部修改了参数值,但原始的引用仍然保持没变。在 obj 内部重写时,这个变量引用的就是一个局部对象了,函数执行完毕后会被立即销毁。

管理内存

  • 局部变量会在他们离开执行环境时被自动接触引用,但全局变量并不会,所以应该手动解除不再使用的对象及属性。
  • 解除一个值的引用并不意味着自动回收该值所占用的内存,而是让值脱离执行环境,从而方便垃圾收集器在下次运行时进行回收。