JavaScript 堆栈内存及内存释放
2020-05-28 本文已影响0人
阿畅_
堆内存
- 对象数据类型或者函数数据类型的定义的时候首先都会开辟一个堆内存。堆内存有一个引用地址,如果外面有变量引入这个地址,就可以理解为这个地址被占用了,不能销毁。
堆内存销毁/释放
- 只需要把所有引入它的变量值,赋值为 null 即可,如果当前的堆内存没有任何东西被占用了,那么浏览器会在空闲的时候把它销毁
栈内存销毁
- 全局作用域: 只有当页面关闭的时候,全局作用域才会销毁
- 私有作用域:
只有函数执行的时候才会产生私有作用域
,一般情况下,函数执行会形成一个新的私有作用域,当私有作用域的代码执行完成后,当前私有所用于会主动的进行释放和销毁。
私有所用于常见的不销毁机制
- 函数执行返回一个引用数据类型的值,并且在函数的外面被一个变量或其它的方式接受了,这种情况下,一般形成的私有作用域都不会销毁
function fn() {
var num = 100
return function() {}
}
var f = fn() // fn执行形成的这个私有作用域就不会销毁
- 在一个私有的作用域中,给 DOM 元素绑定元素方法,一般情况下私有作用域都不会销毁。
- 通过DOM 方法获取的元素或者元素集合都是对象数据类型的值。
var oDiv = document.getElementById('div')
(function() {
oDiv.onclick = function() {}
})() // 当前自执行函数执行形成的私有作用域也不会销毁
- 还有一个种是不立即销毁
- 例如
function fn() {
var num = 100
return function() {
return num
}
}
fn()()
// 首先会执行 fn 函数,返回一个小函数对应的内存地址,然后让返回的小函数执行
- 上面 fn 返回的函数没有被其它东西占用,但是还需要在执行一次,所有暂时不销毁,当返回的值执行完成后,浏览器会在空闲时间把它销毁,这可以理解为
不立即销毁
。