相关疑难解决方法(0)

了解javascript中的事件队列和调用堆栈

我对理解"事件队列"和"调用堆栈"概念的好奇心在我解决这个问题时开始:

var list = readHugeList();

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

    if (item) {
        // process the list item...
        nextListItem();
    }
};
Run Code Online (Sandbox Code Playgroud)

如果数组列表太大,以下递归代码将导致堆栈溢出.你如何解决这个问题仍然保留递归模式?

提到的解决方案是这样的:

var list = readHugeList();

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

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};
Run Code Online (Sandbox Code Playgroud)

解:

由于事件循环处理递归而不是调用堆栈,因此消除了堆栈溢出.当nextListItem运行时,如果item不为null,则将超时函数(nextListItem)推送到事件队列并退出函数,从而使调用堆栈保持清零.当事件队列运行其超时事件时,将处理下一个项目并设置计时器以再次调用nextListItem.因此,在没有直接递归调用的情况下从开始到结束处理该方法,因此无论迭代次数如何,调用栈都保持清晰.

现在我的问题:

Q1)"事件队列"和"调用堆栈"之间有什么区别

Q2)我不明白答案.有人可以详细解释我吗?

Q3)当我在javascript中执行函数或调用变量或对象时.流程怎么样? 什么在调用堆栈?(比方说我做setTimeout ..它是去callstack还是事件队列?)

这些概念非常不清楚.我用谷歌搜索,但大多数结果不是我期望理解的.

请帮忙!

javascript recursion

4
推荐指数
1
解决办法
1183
查看次数

标签 统计

javascript ×1

recursion ×1