<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>内存释放和作用域销毁</title>
</head>
<body>
<div id="div1">
有本事点我啊
</div>
<script type="text/javascript">
// 堆内存
// (垃圾回收)
// 对象数据类型或者函数数据类型在定义的时候首先都会开辟一个堆内存,并且堆内存有一个引用地址,如果外边有变量等知道这个地址,我们就说这个内存被占用了,就不能销毁了
var obj = {name:"张三"};
var obj2 = obj;
// 我们想要让堆内存释放/销毁,只需要把所有的引用他的变量值赋值为null即可,如果当前的堆内存没有东西占用了,那么浏览器会在空闲的时候把它销毁
obj = null; // null 是空对象指针
obj2 = null;
// 栈内存
// 1>全局作用域(浏览器开辟的)
// 只有当页面关闭的时候全局作用域才会销毁
// 2>私有作用域(只有函数执行才会产生私有作用域)
// 一般情况下函数执行会形成一个新的私有的作用域,当私有作用域中的代码执行完成后 我们的当前作用域都会主动的进行释放私有作用域
// 但是还是存在特殊情况
// 当前私有作用域中的部分内存被作用域外的东西占用了,那么当前作用域就不能被销毁了
// a.函数执行返回了一个引用数据类型的值,并且在函数的外边被一个其他的东西给接收了,这种情况下一般形成的私有作用域都不会销毁
function fn() {
var num = 100;
return function () {
num++;
console.log(num);
}
}
var f = fn(); // fn()执行形成的这个私有作用域就不能被销毁了
// b.在一个私有的作用域中给DOM元素的时间绑定方法 一般情况下我们的私有作用域都不销毁
// 通过DOM方法获取的元素 或者 元素集合都是对象数据类型的
var oDiv = document.getElementById("div1"); // 对象数据类型
~function () {
oDiv.onclick = function () {
}
}();// 当前自执行作用域形成的函数也不销毁
// c.下述情况属于不立即销毁 -> fn返回的函数没有被其他的东西占用,但是还需要执行一次,所以暂时不销毁,当返回的值执行完成,浏览器会在空闲的时候把它销毁
function fn() {
var num = 100;
return function () {
}
}
fn()(); // 首先执行fn,返回一个小的函数返回的内存地址,然后紧接着让返回的小函数再执行
</script>
</body>
</html>
网友评论