以下概念引用自MDN
一、javascript创建变量的时候是自动分配内存的,当不使用变量的时候自动释放内存。释放的过程称为垃圾回收。
二、内存的生命周期:分配所需内存;使用分配的内存(读、写);不需要时释放。
三、垃圾回收
1. 引用计算(如果没有引用指向该对象,则该对象会被垃圾回收机制回收。缺点无法处理循环引用的对象。比如两个对象互相引用的时候,回收不了。)
2. 标记清除 (把所有的变量都添加一个标记,然后去掉环境中的变量和被环境中的变量引用的变量的标记。清除标记了的变量。)
四、栈 (stack)
1. 存放在栈里面的东西是先进后出。栈就像是一个直立放着的宽度一致的玻璃瓶,放在里面的东西的宽度是玻璃瓶的宽度,先放进的东西会被后放进去的东西压住,取东西的时候只能够先取最上面的东西。
2. 函数调用形成了一个栈帧 (看下面的例1)
五、堆(heap)
1. 对象被分配到堆当中。用以表示一大块非结构化的的内存区域
六、队列(queue)
1. 队列里面的东西先进先出。
2. 一个js在运行时包含了一个待处理的消息队列。每一个消息都关联着一个用以处理这个消息的函数。处理这个消息的时候,消息会从队列中移出并作为其关联的函数的输入参数,当调用的这个与之关联函数处理完毕之后才继续处理下一个消息。
七、事件循环
1. 执行至完成(每一个消息完整的执行完之后,其他消息才会执行)
2. 添加消息(在浏览器里,当有一个事件发生,且有一个事件监听器绑定在这个事件上时,消息会被随时添加进队列)
八、例子
1. 例1
function sum (num) {
let init = 6
return init + num
}
function multiply (num) {
let init = sum(6)
return init * num
}
multiply(6)
当调用函数multiply的时候,创建了第一个栈帧,帧中包含multiply的参数及局部变量。当multiply调用sum函数时,创建了第二个栈帧,并放到了第一个栈帧的上面,帧中包含sum的参数跟局部变量。当sum被返回时,最上层帧就被弹出栈。当multiply被返回时,栈就空了。
2. 例2
setTimeout(function () {
console.log('这是待加入队列中的消息')
}, 200)
setTimeout第一个参数是待加入队列中的消息。第二个参数是延迟多长时间加入到队列中。这个时间单位是毫秒,不是实际的执行时间,只有当加进去队列的时候队列里面没有别的消息,才会立即执行。setInterval函数也是一样的。所有没有第二个参数或者第二个参数为0的时候,不一定立即执行。