编程语言
首页 > 编程语言> > javascript-setTimeout如何防止潜在的stackoverflow

javascript-setTimeout如何防止潜在的stackoverflow

作者:互联网

一个例子 :

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        setTimeout( nextListItem, 0);
        // ^^^^^^^^ this line
    }
};

使用setTimeout如何在此处防止潜在的堆栈溢出?我了解事件队列以及堆栈的概念,但是我很难将两者连接起来.

解决方法:

设置超时不会引起堆栈溢出,因为它是异步的.它将仅将回调放入事件队列,而不会阻止执行.
在第一种情况下:

setTimeout只是将回调放入事件队列,并且父函数在不忙于堆栈的情况下退出.
  即使超时为0 ms,也会在下一个事件循环中调用它,因此不会阻塞执行代码

var nextListItem = function() {
    var item = list.pop();

    if (item) {
         setTimeout( nextListItem, 0);
    }
};

在第二种情况下:
  父级调用子级功能将新条目放入堆栈,即使未从堆栈中清除父级也是如此.
   最终,更多的递归调用会破坏堆栈.

var nextListItem = function() {
        var item = list.pop();

        if (item) {        
           nextListItem();
        }
    };

标签:javascript,stack-overflow,javascript-events
来源: https://codeday.me/bug/20191011/1891846.html