栈溢出
2021-10-11 本文已影响0人
9月的甜橙子
调用栈是有大小的,当入栈的执行上下文超过一定数目,JavaScript 引擎就会报错,我们把这种错误叫做栈溢出。
举个例子,如果一个函数调用自身,又没有写终止条件,就会栈溢出。
function division(a,b)
{
console.trace(); // 在console中输出函数调用关系
return division(a,b);
}
console.log(division(1,2))
这是因为当 JavaScript 引擎开始执行这段代码时,它首先调用函数 division,并创建执行上下文,压入栈中;然而,这个函数是递归的,并且没有任何终止条件,所以它会一直创建新的函数执行上下文,并反复将其压入栈中,但栈是有容量限制的,超过最大数量后就会出现栈溢出的错误。
理解了栈溢出原因后,你就可以使用一些方法来避免或者解决栈溢出的问题,比如把递归调用的形式改造成其他形式,或者使用加入定时器的方法来把当前任务拆分为其他很多小任务。
为什么使用定时器可以解决栈移除问题?
function foo() { setTimeout(foo, 0) } foo() 像setTimeout 、setInterval Promise 这样的全局函数不是js 的一部分,而是webapi 部分。 当遇到webApi 时,会将其回调函数(foo)交给web apis 处理,此时 调用栈 中foo 函数执行完毕,出栈,栈为空; 回调函数会被发送到任务队列中,等待event loop 事件循环将其捞出 重新放入到堆栈中 .... 参考:https://juejin.im/post/5d2d146bf265da1b9163c5c9#heading-15
栈是一种非常重要的数据结构,不光应用在 JavaScript 语言中,其他的编程语言,如 C/C++、Java、Python 等语言,在执行过程中也都使用了栈来管理函数之间的调用关系。所以栈是非常基础且重要的知识点,你必须得掌握。