Ktoś w pracy żartobliwie wysłany e-mail z pliku HTML przeznaczonych do crash przeglądarki, która była następującaJavaScript Recursion Poprawa
<html>
<script type="text/javascript">
function crash(){
for(i=0;i<5000000001;i++){
document.write(i);
}
}
</script>
<body onload="crash();">
</body>
</html>
Anyways nie wykonują świetną robotę w Chrome i rozmowy Powstało, że stworzył przyjazną konkurencję, aby zobaczyć, kto może napisać javascript, aby jak najszybciej policzyć stronę do 5.000.000.000, nie powodując, że przeglądarka przestanie reagować lub ulegać awarii.
Wpadłem na następujący fragment javascript, który ma być używany w 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>
Dlatego, że to będzie działać tylko w Chrome to, że używam połączenia setTimeout
aby uniknąć tworzenia stackoverflow w Chrome. (Chrome pozwala także na największy zestaw wywołań rekursywnych ze wszystkich przeglądarek).
Czy jest jakiś sposób, aby to policzyć szybciej? Wydaje mi się, że mogę zwiększyć kwotę, która została trochę policzona, zanim spowoduje przepełnienie (gdzieś mniej niż 100). Jedynym zastrzeżeniem jest to, że musi wyświetlać jak najwięcej liczb, jak to się liczy.
Lepsza Kod:
<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>
- Wykonane Ilość i elementem globabl
- Switched wprowadzanie tekstu zamiast div
- przeniósł aktualizacji UI aby po ustawieniu zwrotnego
Nie jestem do końca pewien, jak przekazać funkcję jako odniesienie w JS woudl Po prostu zrobić this.countToFiveBillion zamiast w sposób, w jaki robię to obecnie? – msarchet
Globalnie zadeklaruj zmienne, a następnie zastąp 'setTimeout (..)' przez 'setTimeout (countToFiveBillion, 1)'. –
Ach tak, ma sens – msarchet