堆内存
对象或者函数(引用数据类型) 在定义的时候都会开辟一个堆内存,堆内存有一个引用地址,如果外面有变量引用了这个地址,我们就说这个内存被占用了,不能被销毁了。如果想要销毁堆内存,将所有引用这个堆内存的对象或者函数都赋值为null(空指针)即可。如果堆内存没有任何东西被占用,那么浏览器会在空闲的时候把它销毁(垃圾回收)。

//开辟堆内存
var obj1 = {name:'hxj'};
//销毁堆内存
obj1 = null;栈内存
- 全局作用域
只有页面关闭的时候全局作用域才会销毁
- 私有作用域
一般情况下函数执行时会形成一个新的私有作用域,当私有作用域中代码执行完成时,我们当前的作用域会主动的释放和销毁。
但是还是存在特殊情况的:
当前私有作用域中部分内存被作用域以外的东西占用了,那么当前这个作用域就不能销毁了

1.上图中xxxfff000这个私有作用域开辟了xxxfff111的堆内存,但是这个堆内存被全局作用域下的foo引用,所以xxxfff111不能销毁。因此xxxfff000这个私有作用域也不能销毁,导致xxxfff000中的num也不能销毁。
作用域不能销毁的情况:
函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西给接收了,这种情况下一般形成的私有作用域不能被销毁。
function fn() {
var num = 100;
return function () {
}
}
var f = fn();//fn执行形成这个私有作用域不能被销毁2.在一个私有作用域中给DOM元素事件绑定方法,一般情况下我们的私有作用域不能销毁。
var iDiv = document.getElementById('myId');
function fn() {
iDiv.onclick = function () {
console.log('click');
}
}
fn();//fn不能被销毁
3.不立即销毁->fn返回的函数没有被其他东西占用,但是还是需要再执行一次,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时间把它销毁。
注意下面三个例子之间的区别
1.
function fn() {
var num = 100;
return function () {
}
}
var foo = fn; // fn不销毁2.
function fn() {
var num = 100;
return function () {
}
}
fn();//fn会销毁3.
function fn() {
var num = 100;
return function () {
}
}
fn()();//fn不立即销毁
















