递归函数在iOS早期结束

时间:2015-07-12 22:40:26

标签: javascript ios recursion

问题

我有一个递归函数,它循环遍历数组中的大约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;
&#13;
&#13;

第二次尝试 (有效,但速度很慢)

&#13;
&#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;
&#13;
&#13;

第三次尝试 (效果很好,但看起来很糟糕)

&#13;
&#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;
&#13;
&#13;

问题

  1. 为什么第一次尝试不起作用?是因为记忆吗?

  2. 虽然第三次尝试工作正常,但似乎很笨拙,所以我想知道是否有更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

  

为什么第一次尝试不起作用?是因为记忆吗?

你的第一次尝试是:

RangeError: Maximum call stack size exceeded.

我将它连接到Safari的开发控制台以查找。