日期:2014-05-16  浏览次数:20389 次

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