我估计有不少像我这样非计算机专业的人进入到前端以后,老是在写业务代码,思考什么什么效果如何实现,致使不少基础概念型的东西都理解得并不太清楚。常常一碰到群里讨论的些笔试题什么的,总以为本身像是一个假前端似的,似懂非懂,就算会作也不能清楚的表述为何会是那样的结果。老是本身安慰本身,反正正常项目不多这么写代码。不知道也不要紧,可是时间久了,发现不深入系统的理解这些东西,工做中常常碰到一些莫名其妙的坑,或者有时候以为看别人插件的代码,别人到底是如何一步步实现的?前端
慢慢的就有了愈来愈强的想法把这些基础知识系统的梳理一遍,再也不老是那么碎片化的学习,要善于积累沉淀,多扩散思考,触类旁通,构建点线面知识网络。jquery
回到本文主题,js内存空间算法
想弄清以上问题,须要对内存空间有一个清晰的认知。
在了解内存空间以前,须要先熟悉下三种数据结构。他们分别是栈(stack),堆(heap)和队列(queue)。数组
要简单理解栈的存取方式,能够经过类比乒乓球盒子来分析。浏览器
这种乒乓球的存放方式与栈中存取数据的方式一模一样。处于盒子中最顶层的乒乓球5,它必定是最后被放进去,但能够最早被使用。而若是想要使用底层的乒乓球1,就必须将上面的4个乒乓球取出来,让乒乓球1处于盒子顶层。这就是 ==栈空间后入先出(LIFO, last-in-first-out)== 的特色。网络
堆数据结构是一种树状结构。它的存取数据的方式,则与书架与书很是相似。数据结构
书虽然也整齐的存放在书架上,可是只须要只知道书的名字,就能够很方便的取出想要的书,而不用像从乒乓球盒子里取乒乓球同样,非得将上面的全部乒乓球拿出来才能取到中间的某一个乒乓球。比如在JSON格式的数据中,存储的 key-value 能够是无序的,由于顺序的不一样并不影响使用,只须要关心书的名字。闭包
队列是一种先进先出(FIFO)的数据结构。正如排队过安检同样,排在队伍前面的人必定是最早过检的人。用如下的图示能够清楚的理解队列的原理。函数
js变量能够用来保存两种类型的值:基本类型值和引用类型值。在ES6以前共有6种数据类型:Undefined、Null、Boolean、Number,String和Object,其中前5种是基本类型值。oop
从一个变量向另外一个变量复制基本类型的值,会建立这个值的一个副本。
包含引用类型值的变量实际上包含的并非对象自己,而是一个指向该对象的指针
理解队列数据结构的目的主要是为了清晰的明白事件循环(Event Loop)的机制究竟是怎么回事。队列在本篇文章中并非很关联,只是为了与栈的后入先出造成对比方便联想记忆。
扩散性思考构建点线面知识网络:
js具备自动垃圾收集机制,即执行环境会负责管理代码执行过程当中使用的内存。原理就是找出那些再也不继续使用的变量,而后释放其占用的内存。如今基本全部(谷歌,火狐,IE9+)浏览器的垃圾收集方式都是采用的标记清除(mark-and-sweep)算法,这种算法的思想是给当前不使用的值加上标记,而后再回收其内存。
js的内存声明周期:
js中的变量或者函数根据所处的执行环境(做用域)不一样,分为全局变量和局部变量。
通常状况下,函数执行造成栈内存,函数执行完,浏览器会把造成的栈内存自动释放;有时候执行完成,占内存不能被释放(好比闭包)
全局做用域在加载页面的时候执行,在关掉页面的时候销毁;