javascript - 为什么 setTimeout 对无休止的递归调用有效?

标签 javascript recursion settimeout

这是我的递归函数:

function importTEI(index,data,header){
    if (index == data.length){return}

    var tei = new dhis2API.trackedEntityInstance();
    tei.excelImportPopulator(header,data[index]);
    tei.POST(requestCallback,requestCallback,index);

    function requestCallback(response){
        notificationCallback(response);
        setTimeout(function(){
            importTEI(response.importStat.index+1,importData,header);
        },0);
    }
}

函数 importTEI 在函数内使用 setTimeout 调用。在没有 setTimeout 的情况下调用时,在几次请求后会出现此错误 -

Uncaught RangeError: Maximum call stack size exceeded

但是使用 setTimeout 它会永远运行....怎么会呢? setTimeout 内部发生了什么特别的事情?不再是递归调用了吗?

如有任何提示,我们将不胜感激。谢谢。

最佳答案

不再是递归调用。 setTimeout 是将来的回调,该调用将位于“堆栈顶部”。对您的函数的现有调用会设置此回调,然后完成其执行,从而实现零递归。

关于javascript - 为什么 setTimeout 对无休止的递归调用有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37161211/

相关文章:

javascript - 如何在jquery中跟随鼠标动画

c++ - 在递归中使用一维数组

angular - Angular 的 @HostBinding( 'window:resize' ) 和 Rxjs 的 fromEvent( window, 'resize' ) 之间的区别

javascript - 更快地加载 HTML 表格

javascript - 如何使用JavaScript将文件作为多部分文件上传到后端?

javascript - Angular 获取 Controller 构造函数

java - 在扫雷游戏中发现没有地雷的地区

python - 使用递归计算列表的数量?

JavaScript 不能在循环中使用多个 setTimeout 函数

javascript - 当所有引用都丢失时,停止从对象实例开始的超时