这个章节要来讲述 Javascript 的回收机制,也就式记忆体释放的情况。
假设现在有两个 function 的执行堆叠如上图,在 sayHi 的执行堆叠结束后,会释放掉他所占的记忆体空间
同理,当 doSomthing 的执行堆叠结束后,也会释放掉他所占的记忆体空间
最后只剩下 全域环境 的记忆体占比
而记忆体释放的条件在 MDN 的文件上写到
那么我们来看一下实例
// 随机产生一串很长的字串 function randomString (length) { var result = '', characters = 'AZQCFWVEMBRLKMUJMIKPO', charactersLength = characters.length; for (var i = 0; i < length; i++){ result += characters.charAt(Math.floor(Math.random()*charactersLength)); } return result; } // 範例程式码1 var demoData = []; function getData () { for (let i = 0; i < 1000; i++) { demoData.push(randomString(5000)); } } getData(); console.log(demoData);
执行之后呢,我们可以到 Console 查看结果
并且可以透过 Memory 的工具,点选 Take heap snapshot 来看看佔用了多少记忆体
可以看到这样的结果,总共佔用了 6.4MB 。
那么我们如果把 getData(); 注解掉的话~
console.log就会是空阵列,没错。 那记忆体呢?
变成只有 1.6MB。节省了很多的空间喔!
那么如果换成下面的程式码执行看看呢?
function randomString (length) { var result = '', characters = 'AZQCFWVEMBRLKMUJMIKPO', charactersLength = characters.length; for (var i = 0; i < length; i++){ result += characters.charAt(Math.floor(Math.random()*charactersLength)); } return result; } // 範例程式码2 function getData () { var demoData = []; for (let i = 0; i < 1000; i++) { demoData.push(randomString(5000)); } console.log(demoData); }
可以看到记忆体占比又回到 6.4MB ,这样的写法差异在于我们把 demoData 宣告在 getData 的 function 里面。
这时候,如果把 Console 的暂存清空的话,
会发现记忆体又回到1.6MB,这同时也证明了,chrome中的console.log也会佔记忆体。
以上就是 Javascript 的记忆体存放与释放的观念
希望对大家有帮助 汪汪