我尝试在Firefox和Chrome中都运行以下代码,但该代码可以在Firefox中运行,但可以在Chrome中运行:Maximum call stack size exceeded
。
const list = new Array(60000).join('1.1').split('.');
function removeItemsFromList() {
var item = list.pop();
if (item) {
removeItemsFromList();
}
};
removeItemsFromList();
有什么方法可以防止它并使它在所有浏览器中运行?
一种避免错误的选择是仅在Promise.resolve
:之后进行递归调用:
const list = new Array(60000).join('1.1').split('.');
function removeItemsFromList() {
var item = list.pop();
if (item) {
return Promise.resolve().then(removeItemsFromList);
}
};
removeItemsFromList()
.then(() => console.log('Done'));
如果要使用它setTimeout
而不是Promises,则setTimeout
仅在当前堆栈大小太大时才将递归调用置于:
const list = new Array(60000).join('1.1').split('.');
let i = 0;
function removeItemsFromList() {
i++;
var item = list.pop();
if (!item) {
console.log('Done');
return;
}
if (i > 5000) {
i = 0;
setTimeout(removeItemsFromList);
} else {
removeItemsFromList();
}
};
removeItemsFromList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句