JavaScript栈溢出

171 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第33天,点击查看活动详情

栈溢出

在开发过程中,我们是不是经常在浏览器中看到如下报错信息:

image.png

并且一般出现,页面估计就卡成了麻花,无法操作。

这其实就是出现了栈溢出。是怎么造成了栈溢出呢?

下面我们就来具体看看。

调用栈

调用栈是用来管理函数调用关系的一种数据结构。

每一个函数都存在一个执行上下文,存储这种执行上下文的数据结构叫做栈,这就是调用栈。

我们看如下代码:

首先,我们会创建一个全局上下文,将其压入栈底。全局上下文压入栈后,就开始执行JavaScript代码:给变量a进行赋值2,然后调用addAll函数。

image.png

在addAll函数内部也是一个完整的全局上下文,我们会将该执行上下文也继续压入调用栈中,然后执行addAll函数内部代码。

image.png

addAll函数内部有变量d和函数add,执行时调用add函数,在函数内部也会形成执行上下文,会继续压入调用栈中。

image.png

在addAll函数中执行return返回值后,整个代码执行过程就结束了。

let a = 2
function add(b,c){
  return b + c
}
function addAll(b,c){
  let d = 10
  result = add(b,c)
  return  a + result + d
}
addAll(3,6)

再回到话题的中心:栈溢出。我们知道调用栈是用来存储执行上下文的栈结构,肯定是有大小上限的,当栈被存满后,就出出现栈溢出。当然,一般情况下的调用配合有回收机制是不会出现栈溢出的。出现栈溢出比较常见的情况是死循环,如果我们不断的在调用函数,并且没有设置终止的条件,就会出现栈溢出,开发过程中得特别注意了。

如下:

// 递归
function recursion () {
  return recursion()
}
console.log(recursion())

我们写了个递归调用,没有任何终止条件,肯定会出现栈溢出。