JavaScript中解决堆栈溢出,简单的方法是将堆栈调用改成事件循环

点击上方蓝字关注“小郑搞码事”,每天都能学到知识,搞懂一个问题!

这里,我们要解决的一个问题是,如何用最简单的方法处理JavaScript堆栈溢出的问题,所以,我们得搞一段代码,能让它产生堆栈溢出。如下

JavaScript中解决堆栈溢出,简单的方法是将堆栈调用改成事件循环

这是一个数组,长度为100000。其中倒数第二位的值设成了'小郑搞码事'(为了下面代码演示直观一点),其它位都是按数字顺序输出。

一,产生溢出代码

JavaScript中解决堆栈溢出,简单的方法是将堆栈调用改成事件循环

这段代码很容易看懂,主要利用了一个递归的方法,里面用了一个数组的pop方法,输出数据中所有的值。我们运行一下之后,就产生了堆栈溢出,如下结果:

JavaScript中解决堆栈溢出,简单的方法是将堆栈调用改成事件循环

原因就是每次执行代码时,都会分配一定尺寸的栈空间,每次方法调用时都会在栈里 储存一定信息(如参数,局部变量,返回值等)。这些信息再少也会占用一定空间,累积下来,自然就超过线程的栈空间了。

二,堆栈调用改成事件循环

保留这个递归,消除堆栈溢出,最简单的方法就是改成事件循环来处理,代码很简单:

JavaScript中解决堆栈溢出,简单的方法是将堆栈调用改成事件循环

将nextItem函数直接运行改成加一个定时器。当item不为null,则将函数nextItem推送到事件队列,并且函数退出,从而使调用堆栈清零,看一下输出结果:

JavaScript中解决堆栈溢出,简单的方法是将堆栈调用改成事件循环

没有问题。

总结一下:

JavaScript中解决堆栈溢出,最简单的方法是将堆栈调用改成事件循环来处理。当然还有一些其它的方法,如闭包,或者优化一下现有的代码等。


分享到:


相關文章: