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