堆内存
对象数据类型或者函数数据类型在定义的时候首先都会开辟一个堆内存,堆内存有一个引用地址,如果外面有变量等知道了这个地址,我们就说这个内存被占用了,就不能销毁
var obj = {name:"zhangsan",age:18}
var obj1 = obj // obj1指向obj的引用地址
我们想要让堆内存释放/销毁,只需要把所有引用它的变量赋值为null即可,如果当前的堆内存没有任何东西被占用了,那么浏览器会在空闲的时候把它销毁
var obj = null // 主动销毁
var obj1 = null // 主动销毁
栈内存
全局作用域 只有当页面关闭的时候全局作用域才会销毁
私有作用域 (只有函数执行会产生私有的作用域)
一般情况下,函数执行会形成一个新的私有的作用域,当私有作用域中的代码执行完成后,我们当前作用域都会主动的进行释放和销毁
但是还是存在特殊的情况:
当前私有作用域中的部分内存被作用域以外的东西占用了,那么当前的这个作用域就不能销毁了
a. 函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的东西给接收了,这种情况下一般形成的私有作用域都不会销毁
function fn() {
var num = 100;
return function () {
num ++;
console.log(num);
}
}
var f = fn();
f();
f()
b. 在一个私有的作用域中给DOM元素的事件绑定方法,一般情况下我们的私有作用域都不销毁
var box = document.getElementById('box');
~function(){
box.onclick = function () {
}
}() // 当前这个自执行函数形成的私有作用域也不销毁
c. 下述情况属于不立即销毁 => fn返回的函数没有其他的东西占用,但是还需要执行一次呢,所以暂时不销毁,当返回的值执行完成后,浏览器会在空闲的时候把它销毁了 => "不立即销毁"
function fn1() {
var num = 100;
return function () {
num ++;
console.log(num);
}
}
fn1()();
fn1()();