内存释放(垃圾回收)
1.堆内存
对象数据类型或者函数数据类型在定义的时候都会开辟一个堆内存空间,堆内存有一个引用地址,如果外面有变量指向这个地址,那这个内存就被占用了,则无法被销毁。
如果把所有引用他地址的变量赋值为null,则堆内存释放/销毁。
2.栈内存
栈内存可以理解为作用域。
1.全局作用域
只有当页面关闭的时候全局作用域才会销毁。
2.私有作用域(函数执行会产生私有作用域)
一般情况下,函数执行会形成一个新的私有作用域,当私有作用域中的代码执行完成之后,我们当前的作用域会主动进行释放和销毁。
内存泄漏
JavaScript中最常用的垃圾收集方式是标记清除(mark-and-sweep)。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占的内存,因为只要执行流进入相应的环境,就可能用到它们。而当变量离开环境时,这将其 标记为“离开环境”。
虽然JavaScript 会自动垃圾收集,但是如果我们的代码写法不当,会让变量一直处于“进入环境”的状态,无法被回收。
1.全局变量引起的内存泄漏
function leaks(){
leak = 'xxxxxx';//leak 成为一个全局变量,不会被回收
}
2.闭包引起的内存泄漏
var leaks = (function(){
var leak = 'xxxxxx';// 被闭包所引用,不会被回收
return function(){
console.log(leak);
}
})()
觉得写的不错的小伙伴点赞加关注哦! (=・ω・=)