1.堆内存
对象数据类型或者函数的数据类型在定义的时候首先会开辟一个堆内存,堆内存有一个引用的地址,如果外面有变量知道了这个地址,我们就说这个内存被占用了,就不能销毁了。
var obj = {name: 'ant', age: '5'};
var obj1 = obj;
这时候如果我们要把内存释放或者销毁,只需要把所有的引用它的变量赋值为null即可,如果当前内存没有被任何东西占用,浏览器也会在空闲的时候把它给销毁
obj = null;
obj1 = null
2.栈内存
(1)全局作用域
只有当页面关闭的时候全局作用域才会销毁
(2)私有作用域(只有函数执行才会产生私有作用域)
2.1一般情况下,函数执行会形成一个新的私有的作用域,当私有作用域中的代码执行完成后,我们当前作用域都会主动进行释放和销毁。
2.2但是还是有特殊情况,如果当前作用域中的部分内存被作用域以外的东西占用了,那么当前这个作用域就不会销毁
2.2.1函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西接收了,这种情况下形成的私有作用域不会销毁。
function fn () {
var num = 10;
return function () {
var num = 20;
console.log(num)
}
}
var fn1 = fn () // 这时候fn执行完成的这个私有的作用域就不能再销毁了
2.2.2在一个私有作用域给Dom元素的事件绑定方法,一般情况下我们的私有作用域都不销毁
var oDiv = document.getElementById('div1');
!function () {
oDiv.onclick = function () {}
}(); // 当前函数形成的私有作用域也不能销毁
2.2.3下面这种情况不立即销毁,fn返回的函数没有被其他函数占用,但是还是需要执行一次,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时候把它销毁。
function fn () {
var num = 100;
return function () {}
}
fn ()() //首先执行fn,返回的是一个函数对应的内存的地址,然后让返回的函数再执行
网友评论