今天聊一下JavaScript中的堆栈溢出

一、什么是堆栈溢出?

每次执行JavaScript代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,如果存在较多的此类空间,就会超过线程的栈空间了。
说白了就是就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了别的数据。

二、引起的原因是什么?

     function isEven (num) {if (num == 0) return true;if (num == 1) return false;return isEven(Math.abs(num) - 2);
}
console.log(isEven(1000000000000));  //output Uncaught RangeError: Maximum call stack size exceeded

由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆栈溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

三、怎么解决呢

1、使用setTimeout()来解决(推荐)

  function callback(f) {f();} function foo() {foo(); //执行1000次左右会发生堆栈溢出的错误, //setTimeout(foo, 0); //永远不会堆栈溢出}foo()

2、使用闭包解决

function isEven(num){function isEvenInner(num){if(num === 0){return true;}if(num === 1){return false;}return function(){return isEvenInner(Math.abs(num)-2);}}function simplify(func,num){var value=func(num);while(typeof value == 'function'){value=value();}return value;}return simplify.bind(null,isEvenInner)(num)
}console.log(isEven(100000));//num太大会导致浏览器卡顿

3、使用尾调用(这个方法还不是很了解,想深入了解的朋友可以自寻资料)

后续会继续更新~

JavaScript之堆栈溢出相关推荐

  1. JavaScript:堆栈溢出内存泄漏

    在JavaScript中,会有听到两个概念:堆栈溢出和内存泄漏,这两种机制在开发中遇到的不多,但是一旦碰到就很头疼.下面就分别来讲述一下二者的概念,触发原因以及解决办法. 堆栈溢出: 什么是堆栈溢出? ...

  2. mfc函数调用堆栈溢出_01 JavaScript 调用堆栈

    什么是 JavaScript  调用栈,为什么它是必要的? JavaScript 引擎是一个单线程解析器,而单线程解析器由堆和单一调用栈组成.浏览器提供 Web APIs,比如:DOM,AJAX 和 ...

  3. Javascript中递归造成的堆栈溢出及解决方案

    Javascript中递归造成的堆栈溢出及解决方案 参考文章: (1)Javascript中递归造成的堆栈溢出及解决方案 (2)https://www.cnblogs.com/cuew1987/p/4 ...

  4. 系统在此应用程序堆栈溢出_从部署我的第一个完整堆栈Web应用程序中学到的经验教训...

    系统在此应用程序堆栈溢出 by Will Abramson 威尔·艾布拉姆森(Will Abramson) 从部署我的第一个完整堆栈Web应用程序中学到的经验教训 (Lessons learned f ...

  5. 分析堆栈溢出原因_我分析了有关堆栈溢出的所有书籍。 这是最受欢迎的。

    分析堆栈溢出原因 by Vlad Wetzel 通过弗拉德·韦泽尔 我分析了有关堆栈溢出的所有书籍. 这是最受欢迎的. (I analyzed every book ever mentioned on ...

  6. jquery 堆栈溢出_带有jQuery和CSS3的漂亮照片堆栈库

    jquery 堆栈溢出 View demo 查看演示Download Source 下载源 In this tutorial we are going to create a nice and fre ...

  7. 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈

    系统在此应用程序堆栈溢出 You have a great online business idea along with investors and a team ready to get behi ...

  8. 内存溢出和堆栈溢出_使用堆栈溢出的最佳和最差方法

    内存溢出和堆栈溢出 Stack Overflow is an incredible collection of programming and software knowledge. Thousand ...

  9. 一段堆栈溢出的代码_为什么堆栈溢出的代码片段会破坏您的项目

    一段堆栈溢出的代码 Stack Overflow has been the saviour of many programmers, including me. Some of us have nev ...

  10. 【前端】递归之引起堆栈溢出解决方案

    简介:递归引起错误VM434:1 Uncaught RangeError: Maximum call stack size exceeded 优化前递归 ``` function obj(x,y){i ...

最新文章

  1. oracle数据库性能优化 - 降低IO
  2. 机器学习的中流砥柱:用于模型构建的基础架构工具有哪些?
  3. Linux下时间戳的换算方法
  4. 张艾迪(创始人): 梦想与未来
  5. 用C语言实现linux的ping,用C语言实现Ping程序功能
  6. 学生上课睡觉班主任怎么处理_班主任案例:学生上课睡觉应对策略
  7. java决策树_【Java】决策树介绍和使用
  8. linux多线程 pthread用法
  9. php发表图片文章代码,PHP实现发表文章时自动保存图片_php
  10. Linux基本操作——Linux磁盘基本概念
  11. VS2010复制项目
  12. 如何实现用户认证授权系统
  13. mysql去掉两个最高分_Excel函数 去掉最高分和最低分取平均值?这个函数不可不知...
  14. 浙大版c语言程序设计第三版邀请码,浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序...
  15. 计算机如何调整对比度,怎么调整电脑显示器亮度和对比度
  16. 毕业好几年,改行学IT哪个岗位容易上手?
  17. style是什么意思
  18. word2vec损失函数
  19. Deep Unordered Composition Rivals Syntactic Methods for Text Classification
  20. 个人计算机视觉学习路线

热门文章

  1. python 算24 代码
  2. matlab图上面加箭头,利用matlab如何在图形中绘制箭头
  3. 反编译so库破解so
  4. php使用Yar实现RPC调用
  5. 小鸡腿U T7 NEERC2011
  6. pyecharts 大小_[pyecharts1.7] 图表基础设置:大小、背景色、配色主题等
  7. and什么意思计算机SQL,SQL语句中 AND和OR的区别,or是什么意思,那and和它有什么区别?...
  8. Melancholy 题解
  9. 数据库--T-SQL创建数据库表
  10. c语言中ifelse意义,c语言if和else if的区别