我試圖呼叫一個函式,以便當我單擊按鈕時它會增加到 1,000,000,然后顯示它。但是,當我呼叫它時,增量只會達到 9627。我無法確定問題出在哪里。
<body>
<script>
var counter = 0;
function count() {
counter ;
document.getElementById('display').value = counter;
for (var i = 1; i <= 1000000; i ) count(i);
}
</script>
<div>
<center>
<button onclick="count();">Let's Count to 1,000,000</button>
<input type="number" id="display" value="0"></input>
</center>
</div>
</body>
uj5u.com熱心網友回復:
您正在對函式使用遞回,并且嵌套范圍僅在一定程度上受支持(這就是為什么您會卡在 ~10k;谷歌“最大呼叫堆疊”以獲得更多資訊)。
為了解決這個問題,我只需將遞回扔掉,然后更新計數器。這樣做的問題是回圈運行得非常快,因此計數器只會在達到 1M 時更新(對元素值的立即后續更改由瀏覽器優化,element.value
在實際重新渲染之前掛起等待最后一次呼叫)。
<body>
<script>
function count() {
var counter = 0; // Putting the counter in here makes the counting repeatable
for (var i = 1; i <= 1_000_000; i ) {
counter ;
document.getElementById('display').value = counter;
}
}
</script>
<div>
<center>
<button onclick="count();">Let's Count to 1,000,000</button>
<input type="number" id="display" value="0"></input>
</center>
</div>
</body>
或者,如果您不希望計數器盡可能快地運行(取決于硬體,它在最大速度下的運行時間不應超過 3 秒),您可以使用setInterval
,或者,正如 Kinglish 在另一個答案中所參考的那樣,setTimeout
. 這是一個片段setInterval
:
<body>
<script>
function count() {
var counter = 0;
var incrementer = setInterval(() => {
// here "incrementer" gets assigned the id of setInterval,
// that will later be used to clear the interval
counter ;
document.getElementById("display").value = counter;
if (counter >= 1_000_000) {
clearInterval(incrementer);
}
}, 1000 / 30);
// the second number (30) represents the times the function will
// be called per second
}
</script>
<div>
<center>
<button onclick="count();">Let's Count to 1,000,000</button>
<input type="number" id="display" value="0"></input>
</center>
</div>
</body>
uj5u.com熱心網友回復:
只需使用 for 回圈,達到 100 萬需要 5?? 秒,但它有效:
<body>
<script>
var counter = 0;
function count() {
var counter = 0;
for (var i = 1; i <= 1000000; i ) {
document.getElementById('display').value = i;
}
}
</script>
<div>
<center>
<button onclick="count();">Let's Count to 1,000,000</button>
<input type="number" id="display" value="0"></input>
</center>
</div>
</body>
uj5u.com熱心網友回復:
如前所述,您采用這種結構的方式會導致遞回回圈,從而引發 Max 呼叫堆疊錯誤。這是另一種方法,使用setTimeout
. https://developer.mozilla.org/en-US/docs/Web/API/setTimeout
let counter = 0, d = document.querySelector('#display');
function count() {
d.value = counter;
if ( counter < 1000000) setTimeout(() => {
count()
}, 1);
}
<div>
<center>
<button onclick="count();">Let's Count to 1,000,000</button>
<input type="number" id="display" value="0"></input>
</center>
</div>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368827.html
標籤:javascript html 循环 增量
上一篇:Arduino定時器回圈
下一篇:優化估計Pi函式C