作用域
js作用域有两种,
- 函数限定的作用域
函数内定义的变量,只能在函数内访问,函数外不能访问 - 子域访问父域
函数中定义函数,就是子域,也就是闭包。
搜索变量时,只能沿着作用域链往上搜索,不能沿着作用域链往下搜索。
函数执行完毕后,函数内的变量就会自动销毁,内存中仅保存全局变量。
- 对局部变量,即函数内的变量,函数执行完毕后,会自动解除引用
- 对全局变量,一旦不再使用,最好置为null以解除引用,否则,容易造成内存泄漏
内存泄露,就是不再使用的变量仍然占用着内存。
垃圾回收机制
js有两种垃圾回收机制,
- 标记清除
标记变量是否再使用,有很多方法,比如:
调用函数时,函数内定义的变量 放入“进入环境”的变量列表中;
函数调用结束后,函数内定义的变量 放入“离开环境”的变量列表中,并清除变量占用的内存。 - 引用计数
如果一个引用类型值赋给了一个变量v1,那么这个值引用次数就是1;
如果这个引用类型值又赋给了另一个变量v2,则引用次数加1,即变成了2;
如果引用这个值的变量v1改取了其他值,那么引用次数减1,即变回了1。
只有这个值的引用次数是0时,其所占用的内存空间才会被释放。
现在主流浏览器都是采用标记清除的垃圾回收策略,引用计数不常见。
但在使用全局变量时,一旦无用要及时置null以解除其引用,这样垃圾回收器才能将其回收,释放其所占内存,从而让有限的浏览器内存得到有效利用。