h-blog

巧用异步事件队列.

let list = readHugeList();
let nextListItem = function() {
    let item = list.pop();
    if (item) {
        // process the list item...
        nextListItem();
    }
};

简而言之就是,函数之行到 timeout 时, 将 nextListItem 放入宏任务队列(原本应该是递归操作), 利用时间循环处理, 然后继续之行之后的代码. 在执行结束之后, 将结束该函数的函数栈. 主栈空了空了之后, 进入宏任务队列, 由时间循环机制处理刚刚放入的 nextListItem . 如此一来, 就没有嵌套函数栈了.

let list = readHugeList();
let nextListItem = function() {
    let item = list.pop();
    if (item) {
        // process the list item...
        setTimeout(nextListItem, 0);
    }
};

备注:方案缺点也很明显,所有方案脱离场景说好坏都是耍流氓, 可以多一种思路。仅此而已。