Javascript中递归造成的堆栈溢出及解决方案
来源:互联网 发布:js简易计算器 编辑:程序博客网 时间:2024/06/07 13:52
关于堆栈的溢出问题,在Javascript日常开发中很常见,Google了下,相关问题还是比较多的。本文旨在描述如何解决此类问题。
首先看一个实例(当然你可以使用更容易的方式实现,这里我们仅探讨递归):
当我们把参数改成10000时,运行下例会发生堆栈溢出:
原因是每次执行代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,成千上万个此类空间累积起来,自然就超过线程的栈空间了。那么如何解决此类问题?
使用闭包:
此时每次调用时,返回一个匿名函数,匿名函数执行相关的参数和局部变量将会释放,不会额外增加堆栈大小。
优化调用:
上例调用比较麻烦,优化如下:
现在我们可以解决堆栈溢出问题了,但是不是感觉每次tarmpoline(isEven, 1000)这种调用方式不是很好,我们可以使用bind来绑定:
虽然上例实现了我们想要的效果,但是trampoline函数还是有一定的局限性:
1.假设你只传递一个参数给递归函数
value = func(arg); 修改为 value = func.apply(func, arg);
2.假设最后的返回值不是一个函数
关于更健壮性的实现,请看underscore-contrib中源码。
阅读全文
0 0
- Javascript中递归造成的堆栈溢出及解决方案
- Javascript中递归造成的堆栈溢出及解决方案
- javascript 深度递归引起的堆栈溢出,终极解决方案
- jackson java转json hibernate 造成的堆栈溢出 无限递归问题
- android 慎用drawable中大图,造成内存溢出的解决方案
- android 慎用drawable中大图,造成内存溢出的解决方案
- javascript递归调用,产生堆栈溢出原因
- VS 堆栈溢出的解决方案
- c 中 关于栈溢出 及 堆栈的区别
- 递归算法堆栈溢出
- chkstk.asm堆栈溢出的一种解决方案
- 多线程运行递归函数导致堆栈溢出的问题
- 10.1.1避免尾递归的堆栈溢出
- c++堆栈溢出的处理(包括递归)
- Java中equals方法造成空指针异常的原因及解决方案
- 堆栈溢出 的现象,
- 堆栈的溢出
- 堆栈的缓冲区溢出
- python学习之 小技巧
- CSS强制换行
- 第13周 【项目四】 平衡二叉树相关算法
- 第十三周 项目一 验证算法3.验证二叉排序树相关算法
- php 去除数据中所有值里的空格
- Javascript中递归造成的堆栈溢出及解决方案
- 如何从外部访问Kubernetes集群中的应用?
- 关联查询
- Python编程:从入门到实践的动手试一试答案(第二章)
- 【转】POM文件org.apache.maven.archiver.MavenArchiver.getManifest错误
- linux服务器出现大量CLOSE_WAIT状态的连接
- Springboot使用FastJson后,接口返回中文乱码的问题解决(两种解决方式)
- 第5章 URL,HTTP机制和视图
- 【第十三周项目3】是否二叉排序树?