栈溢出

作者: 9月的甜橙子 | 来源:发表于2021-10-11 09:16 被阅读0次

调用栈是有大小的,当入栈的执行上下文超过一定数目,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 等语言,在执行过程中也都使用了栈来管理函数之间的调用关系。所以栈是非常基础且重要的知识点,你必须得掌握。

思考题:js引擎和web api的关系

相关文章

  • 浅说iOS为什么会上栈溢出

    简介 本文介绍了如下内容 栈的概念 为什么会发生栈溢出 栈溢出的几种栗子 怎么预防和发现栈溢出。 什么是栈? 从数...

  • 栈溢出简易指南

    栈 pwn 主题: 基本栈溢出 针对缓存区溢出防护的对策 shellcode 栈溢出的最终目的是执行shellco...

  • JVM

    1、一般什么情况会发生栈溢出、堆溢出 栈溢出(StackOverflowError) 1、栈是线程私有的,他的生命...

  • Canary机制及绕过策略-格式化字符串漏洞泄露Canary

    Canary主要用于防护栈溢出攻击。我们知道,在32位系统上,对于栈溢出漏洞,攻击者通常是通过溢出栈缓冲区,覆盖栈...

  • 2019-04-06 递归函数

    栈溢出

  • 缓冲区溢出提纲

    缓冲区溢出简单的来讲分为两种 栈溢出 堆溢出 那么什么是栈什么是堆呢 在这里简单谈一下对于堆和栈的理解 : 栈: ...

  • 无题-_-

    浅谈缓冲区溢出之栈溢出<上>

  • 栈溢出

    栈中压入数据栈顶指针地址变小 pop数据栈顶指针地址变大 也就是说栈底指针地址大于栈顶地址 EIP:扩展指令指针。...

  • 栈溢出

    function runStack (n) {if (n === 0) return 100;return run...

  • 栈溢出

    调用栈是有大小的,当入栈的执行上下文超过一定数目,JavaScript 引擎就会报错,我们把这种错误叫做栈溢出。举...

网友评论

      本文标题:栈溢出

      本文链接:https://www.haomeiwen.com/subject/ncgcoltx.html