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来实现递归的中断.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值