有人在工作中開玩笑地發出了一封電子郵件,意在崩潰的瀏覽器,這是下面的Javascript遞歸改進
<html>
<script type="text/javascript">
function crash(){
for(i=0;i<5000000001;i++){
document.write(i);
}
}
</script>
<body onload="crash();">
</body>
</html>
一個HTML文件,反正它不會在Chrome和談話做一個偉大的工作它引發了一場友好的競賽,看看誰能夠儘可能快地編寫javascript來使頁數達到50億,而不會導致瀏覽器無響應或崩潰。
我想出了下面的一段JavaScript代碼是意在Chrome瀏覽器中使用。
<html>
<script type="text/javascript">
function countToFiveBillion(counter, num){
if(num < 5000000000)
{
num++;
if(num % 18700 == 0){
counter.innerHTML = num;
setTimeout(function() {countToFiveBillion(counter, num)}, 1);
} else {
countToFiveBillion(counter, num);
}
}
}
function initiateCountDown()
{
var counter = document.getElementById("counter");
var num = +counter.innerHTML;
countToFiveBillion(counter, num);
}
</script>
<body onload="initiateCountDown();">
<div id="counter">0</div>
</body>
</html>
,這將僅適用於Chrome運行的原因是,我使用的setTimeout
呼籲避免在Chrome中創建一個計算器。 (Chrome還允許您爲所有瀏覽器中遞歸調用的最大堆棧)。
有什麼辦法,我讓這個計算任何更快?我認爲我可以提高計數的小的量就導致溢出(的地方不到100雖然)之前唯一的要求是有,因爲它計算顯示儘可能多的數字作爲可能的。
提高代碼:
<html>
<script type="text/javascript">
var counter;
var num = 0;
function countToFiveBillion(){
if(num < 5000000000)
{
num++;
if(num % 18701 == 0){
setTimeout("countToFiveBillion()", 1);
counter.value = num;
} else {
countToFiveBillion();
}
} else {
counter.value = "number greater than 5 Billion";
}
}
function initiateCountDown()
{
counter = document.getElementById('counter');
countToFiveBillion();
}
</script>
<body onload="initiateCountDown();">
<input type="text" id="counter" value="0" />
</body>
</html>
- 製造數和元素globabl
- 切換到文本而不是DIV輸入
- 移動更新UI來設置回調
我不完全知道如何傳遞一個函數在JS參考woudl我只是做的,而不是我目前做的方式this.countToFiveBillion? – msarchet
全局聲明變量,然後更換'的setTimeout(..)''通過的setTimeout(countToFiveBillion,1)'。 –
是啊,有道理 – msarchet