JavaScript之堆栈溢出
今天聊一下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之堆栈溢出相关推荐
- JavaScript:堆栈溢出内存泄漏
在JavaScript中,会有听到两个概念:堆栈溢出和内存泄漏,这两种机制在开发中遇到的不多,但是一旦碰到就很头疼.下面就分别来讲述一下二者的概念,触发原因以及解决办法. 堆栈溢出: 什么是堆栈溢出? ...
- mfc函数调用堆栈溢出_01 JavaScript 调用堆栈
什么是 JavaScript 调用栈,为什么它是必要的? JavaScript 引擎是一个单线程解析器,而单线程解析器由堆和单一调用栈组成.浏览器提供 Web APIs,比如:DOM,AJAX 和 ...
- Javascript中递归造成的堆栈溢出及解决方案
Javascript中递归造成的堆栈溢出及解决方案 参考文章: (1)Javascript中递归造成的堆栈溢出及解决方案 (2)https://www.cnblogs.com/cuew1987/p/4 ...
- 系统在此应用程序堆栈溢出_从部署我的第一个完整堆栈Web应用程序中学到的经验教训...
系统在此应用程序堆栈溢出 by Will Abramson 威尔·艾布拉姆森(Will Abramson) 从部署我的第一个完整堆栈Web应用程序中学到的经验教训 (Lessons learned f ...
- 分析堆栈溢出原因_我分析了有关堆栈溢出的所有书籍。 这是最受欢迎的。
分析堆栈溢出原因 by Vlad Wetzel 通过弗拉德·韦泽尔 我分析了有关堆栈溢出的所有书籍. 这是最受欢迎的. (I analyzed every book ever mentioned on ...
- jquery 堆栈溢出_带有jQuery和CSS3的漂亮照片堆栈库
jquery 堆栈溢出 View demo 查看演示Download Source 下载源 In this tutorial we are going to create a nice and fre ...
- 系统在此应用程序堆栈溢出_Web应用程序:在开始之前选择正确的技术堆栈
系统在此应用程序堆栈溢出 You have a great online business idea along with investors and a team ready to get behi ...
- 内存溢出和堆栈溢出_使用堆栈溢出的最佳和最差方法
内存溢出和堆栈溢出 Stack Overflow is an incredible collection of programming and software knowledge. Thousand ...
- 一段堆栈溢出的代码_为什么堆栈溢出的代码片段会破坏您的项目
一段堆栈溢出的代码 Stack Overflow has been the saviour of many programmers, including me. Some of us have nev ...
- 【前端】递归之引起堆栈溢出解决方案
简介:递归引起错误VM434:1 Uncaught RangeError: Maximum call stack size exceeded 优化前递归 ``` function obj(x,y){i ...
最新文章
- oracle数据库性能优化 - 降低IO
- 机器学习的中流砥柱:用于模型构建的基础架构工具有哪些?
- Linux下时间戳的换算方法
- 张艾迪(创始人): 梦想与未来
- 用C语言实现linux的ping,用C语言实现Ping程序功能
- 学生上课睡觉班主任怎么处理_班主任案例:学生上课睡觉应对策略
- java决策树_【Java】决策树介绍和使用
- linux多线程 pthread用法
- php发表图片文章代码,PHP实现发表文章时自动保存图片_php
- Linux基本操作——Linux磁盘基本概念
- VS2010复制项目
- 如何实现用户认证授权系统
- mysql去掉两个最高分_Excel函数 去掉最高分和最低分取平均值?这个函数不可不知...
- 浙大版c语言程序设计第三版邀请码,浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序...
- 计算机如何调整对比度,怎么调整电脑显示器亮度和对比度
- 毕业好几年,改行学IT哪个岗位容易上手?
- style是什么意思
- word2vec损失函数
- Deep Unordered Composition Rivals Syntactic Methods for Text Classification
- 个人计算机视觉学习路线
热门文章
- python 算24 代码
- matlab图上面加箭头,利用matlab如何在图形中绘制箭头
- 反编译so库破解so
- php使用Yar实现RPC调用
- 小鸡腿U T7 NEERC2011
- pyecharts 大小_[pyecharts1.7] 图表基础设置:大小、背景色、配色主题等
- and什么意思计算机SQL,SQL语句中 AND和OR的区别,or是什么意思,那and和它有什么区别?...
- Melancholy 题解
- 数据库--T-SQL创建数据库表
- c语言中ifelse意义,c语言if和else if的区别