javascript 深度遞迴引起的堆疊溢位,終極解決方案

來源:互聯網
上載者:User
<Script>var i = 0;function callback( ) {    i++;    document.writeln(i);    if (i == 1000000000) {        return; //迴圈到很多次才返回.ie下一般3000多層就堆疊溢位了, google瀏覽器相對要大一點一般9500以上..    } else {        callback( );  //遞迴調用    }} callback(i);</script>

上面這段代碼在ie下和Google,Firefox下都會引起堆疊溢位.而得不到全部的運行.

改成下面的就可以了..

<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來實現遞迴的中斷.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.