1:基本概念栈(stack):用来保存简单的数据字段。堆(heap):用于在栈中保存对简单数据字段中指针的引用。队列:是一种先进先出的线性数据结构。入栈和出栈函数调用的顺序遵循先进后出的原则。空间分配:Heap:一般由程序员释放,如果程序员不释放,最后会被OS回收;Stack:一般由操作系统自动分配释放。缓存方式:Heap:存放在二级缓存中,生命周期一般由虚拟机的垃圾回收算法决定;Stack:存放在一级缓存中,调用时在存储空间中,而调用后立即释放。操作数据:栈(先进先出)、队列(先进先出)。调用堆栈是一种堆栈结构,用于存储有关计算机程序在执行期间的活动子例程的信息。它是一个后进先出的数据结构,会记录代码运行时的执行上下文。当它遇到一个函数调用语句时,它会记录当前的执行上下文,将函数压入栈中,并为其创建一个新的执行上下文。(比如正在执行什么函数,这个函数调用了什么函数等)。调用堆栈是解析器的一种机制。JavaScript是一种单线程语言,主线程一次只能处理一件事。javascript如何处理函数的调用关系?答案是——调用栈。2:事件循环(EventLoop)JavaScript是一个单线程,它执行的所有代码都放在下面的CallStack中。CallStack执行完后,会去右边的队列中寻找任务。如果有微任务,先执行微任务,再执行宏任务。事件循环:同步任务进入主线程,异步任务加入任务队列。主线程的任务执行完后,再执行任务队列中的任务,不断重复这个过程。所有的同步任务都在主线程上执行,形成一个执行栈。在主线程之外,有一个任务队列。当异步任务有运行结果时,会在任务队列中放入一个任务。执行栈中的同步任务全部执行完毕后,读取任务队列(先读取microtasks、macrotasks),重复上面的第三步。由于js是单线程的,所以必须要排队才能执行代码。如何排队这个队列就是EventLoop。虽然js是单线程的,但是浏览器不是单线程的。console.log('scriptstart');setTimeout(function(){console.log('timeout1');},10);newPromise(resolve=>{console.log('promise1');resolve();setTimeout(()=>console.log('timeout2'),10);}).then(function(){console.log('then1')})console.log('scriptend');//*scriptstart*promise1*scriptend*then1*timeout1*timeout23:宏任务(Mask-task)setTimeoutsetIntervalI/O特性:在JavaScript线程之外由宿主线程执行,例如定时器触发线程setTimeout、setInterval、异步http请求线。如果JavaScript线程不空闲,宏任务将永远没有机会执行。for(leti=0;i<100000000;i++){}setTimeout(function(){console.log('setTimeout1');},1000);setTimeout(function(){console.log('setTimeout2');},2000);4:微任务(Mask-task)promise特性:由JavaScript线程维护,其执行时间在主线程中所有可执行代码执行完毕后执行,会在浏览器渲染之前执行的DOM。
