js内存释放和作用域销毁

堆内存

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

js内存释放和作用域销毁_第1张图片

//开辟堆内存
var obj1 = {name:'hxj'};
//销毁堆内存
obj1 = null;

栈内存

  •  全局作用域

       只有页面关闭的时候全局作用域才会销毁

  • 私有作用域

       一般情况下函数执行时会形成一个新的私有作用域,当私有作用域中代码执行完成时,我们当前的作用域会主动的释放和销毁。

       但是还是存在特殊情况的:

       当前私有作用域中部分内存被作用域以外的东西占用了,那么当前这个作用域就不能销毁了

js内存释放和作用域销毁_第2张图片

       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不能被销毁

js内存释放和作用域销毁_第3张图片

       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不立即销毁

 

你可能感兴趣的:(js)