首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

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

2012-08-31 
javascript 深度递归引起的堆栈溢出,终极解决方案Scriptvar i 0function callback( ) {i++document.

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

<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来实现递归的中断.

热点排行