一、垃圾回收
JS是使用垃圾回收编程语言,开发者无需操心内存分配和回收。
JS中最常见的垃圾回收策略是标记清理,当值离开作用域是会被标记为可回收,垃圾回收期间被删除。(window中的变量不会被删除)
如:
window.name = 'tom'
var age = 17
以上这两个值都不会被回收,因为是在window的作用域下,而window作用域不会消失。
二、内存管理
1.释放变量
优化内存的最佳手段就是保证在执行代码时值保存必要的数据。如果数据不再必要,那么把它设置为null,从而释放气引用。
如下:
function createPerson (name) {
var localPerson = new Object();//这里的localPerson无需释放,当函数执行完时变量会被自动释放
localPerson.name = name;
return localPerson;
};
var gllbalPerson = createPerson("Nicholas");
// 手工解除globalPerson的引用
globalPerson = null;
(使用const和let声明可以提高性能)
let和const以块(而非函数)为作用域,使用者两个关键字可能会更糟的让垃圾回收程序介入,更早地回收内存。
2.隐藏类和删除操作
两个由同个构造函数创建出来的对象,尽可能的在构造函数中一次性声明所有的属性:
function Atricle(){
this.title= 'ohhhh'
this.friend = 'jack'
}
let a = new Atricle()
let b = new Atricle()
//a.friend = 'jack' //此处的friend应在构造函数中声明 避免创建再补充
若其中的构造实例不需要该属性,则设置为null即可
a.friend = null
3.内存泄漏
1.意外声明全局变量最常见也是最容易修复的内存泄漏问题。
如下:
function setName(){
//这里的name没有使用var、let等关键字声明 就相当于(window.name= 'jack') 而window本身不会消失
name = 'jack'
}
2.定时器
let name = 'jack'
setInterval(()=>{
console.log(name)
})
3.闭包
let outer = function(){
let name = 'jack'
return function(){
return name
}
4.静态分配
如果矢量对象的生命周期很短,那么要尽可能的不要动态创建矢量对象
function addVector(a,b){
let resultant = new Vector();
resultant.x = a.x + b.x
resultant.y = a.y + b.y
return resultant
}
应优化为:
let resultant = new Vector();
function addVector(a,b,resultant){
resultant.x = a.x + b.x
resultant.y = a.y + b.y
return resultant
}