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