javascript 深度递归引起的堆栈溢出,终极解决方案

来源:互联网 发布:淘宝卖童装怎么样 编辑:程序博客网 时间:2024/05/20 11:47
<Script>var i = 0;function callback( ) {    i++;    document.writeln(i);    if (i == 1000000000) {        return; //循环到很多次才返回.ie下一般3000多层就堆栈溢出了, google浏览器相对要大一点一般9500以上..    } else {        callback( );  //递归调用    }} callback(i);</script>


上面这段代码在ie下和谷歌,火狐下都会引起堆栈溢出.而得不到全部的运行.

改成下面的就可以了..

<Script>var i = 0;function callback(p1,p2,p3,p4 ) {    i++;    document.writeln(p1);    if (i == 100000) {        return; //循环到很多次才返回.ie下一般3000多层就堆栈溢出了, google浏览器相对要大一点一般9500以上..    } else {       addTask(callback,0,"参数"+i,"参数2","参数3","参数4");  //递归调用变成了非递归调用    }}/***添加一个任务,*  @param {Function} fun 任务函数名* @param {number} delay 定时时间* @param {object} params 传递到fun中的参数*/function addTask(fun, delay) {    if (typeof fun == 'function') {        var argu = Array.prototype.slice.call(arguments, 2);        var f = (function () {            fun.apply(null, argu);        });        return window.setTimeout(f, delay);    }    return window.setTimeout(fun, delay);}callback(i);</script>


 

巧妙的利用了window.setTimeout来实现递归的中断.
原创粉丝点击