内存

以下概念引用自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的时候,不一定立即执行。

转载于:https://www.cnblogs.com/shulan-hu/p/11512499.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值