我有一个递归函数,它循环遍历数组中的大约20,000个项目。 它在桌面上工作正常,但在iOS Safari和Chrome中大约10,600次迭代后停止。
注意:我在网络工作者中这样做是为了避免阻止用户界面,但问题可以在没有用户的情况下重现,所以我将其删除进行测试。我还删除了数组,我只是在以下代码中递增i
。
首次尝试 (在iOS上未完成) :
window.onload = function(){
var i = 0, max = 20000, status = document.body;
foo();
function foo(){
status.innerHTML = i + '/' + max; // Just for testing - not in my code
if(i < max){
i++;
foo(); // Calling the function immediately
}
}
};
&#13;
第二次尝试 (有效,但速度很慢) :
window.onload = function(){
var i = 0, max = 20000, status = document.body;
foo();
function foo(){
status.innerHTML = i + '/' + max; // Just for testing - not in my code
if(i < max){
i++;
setTimeout(foo,0); // Using a timeout
}
}
};
&#13;
第三次尝试 (效果很好,但看起来很糟糕) :
window.onload = function(){
var i = 0, max = 20000, status = document.body;
foo();
function foo(){
status.innerHTML = i + '/' + max; // Just for testing - not in my code
if(i < max){
i++;
if(i%1000 == 0) setTimeout(foo,0); // Using timeout every 1000 items
else foo(); // Calling immediately otherwise
}
}
};
&#13;
为什么第一次尝试不起作用?是因为记忆吗?
虽然第三次尝试工作正常,但似乎很笨拙,所以我想知道是否有更清洁的方法吗?
答案 0 :(得分:1)
为什么第一次尝试不起作用?是因为记忆吗?
你的第一次尝试是:
RangeError: Maximum call stack size exceeded.
我将它连接到Safari的开发控制台以查找。