堆回收
堆: 存放的时属性名和属性值或函数体的字符串;
对象数据类型或者函数数据类型在定义的时候首先都会开辟一个堆内存,堆内存有一个引用地址,如果外面有变量指到了这个地址,那么这个内存就被占用了,不能销毁了。如果要销毁/释放堆内存,就让这个变量的值等于null。
栈回收
栈: 是js代码执行的环境。
全局作用域下:当页面关闭的时候全局作用域才会销毁。
私有作用域:一般情况下,函数执行还会琮琤一个新的私有作用域,当私有作用域中的代码执行完成后,当前作用域都会进行释放和销毁。
特殊情况下,当私有作用域中的部分内存被作用域以外的东西占用了,那么当前的这个作用域就不能销毁了。这样的情况如下:
A) 函数执行返回了一个引用数据类型的值,并且在函数的外面被一个其他的变量给接收了,这个情形下形成的作用域不会销毁(例如:闭包)
function fn(){
var num = 10;
return function(){
num++;
}
}
var f = fn();
B) 在一个私有的作用域中给DOM元素的事件绑定方法,一般情况下都不能销毁(通过DOM方法获取的元素都是对象数据类型的值)
var box = document.getElementById('box');
~function(){
var num = 10;
box.onclick = function(){
num++;
console.log(num) //11
}
console.log(num) // 10
}()
C) 当函数内部返回的函数没有被其他的变量占用,但是还需要执行一次的时候,不立即销毁。
function fn(){
var num = 10;
return function(){
num++;
console.log(num)
}
}
fn()();