未捕获的 RangeError:JavaScript 上的最大调用堆栈大小已超出
2015-12-21
1327
好吧,我正在尝试做一个圣诞节倒计时,但出现了这个错误 我是新手,请帮忙
<script>
function Falta() {
var d = new Date();
var di = 25 - d.getDate();
var ho = 23 - d.getHours();
var mi = 59 - d.getMinutes();
var se = 59 - d.getSeconds();
var di = checkTime(di);
var ho = checkTime(ho);
var mi = checkTime(mi);
var se = checkTime(se);
var t = setTimeout(Falta(), 500)
document.getElementById("demo").innerHTML = di + ":" + ho + ":" + mi + ":" + se;
}
function checkTime(i) {
if (i < 10) {i = "0" + i};
return i;
}
</script>
<div id="demo" onclick="Falta()">Click!</div>
3个回答
您的代码中存在一些错误。
- 缺少分号。
- 内联事件处理程序(虽然可以工作,但不推荐使用)。
-
执行
Falta()
函数,而不是仅通过引用传递它。 -
设置变量后,重复使用
var
关键字。
我已经设置了一个 JSFiddle ,其中包含您的想法的工作演示。
HTML
<div id="demo">
Click!
</div>
简单干净,没有内联事件处理,这允许将您的 HTML 与您的 JavaScript 。
JavaScript
demoDiv = document.getElementById("demo"); //added a reference for the div
demoDiv.addEventListener("click",Falta); //added the onclick event
function Falta() {
var d = new Date();
var di = 25 - d.getDate();
var ho = 23 - d.getHours();
var mi = 59 - d.getMinutes();
var se = 59 - d.getSeconds();
di = checkTime(di); //removed var keywords
ho = checkTime(ho);
mi = checkTime(mi);
se = checkTime(se);
setTimeout(Falta, 500); //added semicolon, removed parenthesis
demoDiv.innerHTML = di + ":" + ho + ":" + mi + ":" + se;
}
function checkTime(i) {
if (i < 10) {
i = "0" + i
};
return i;
}
因此,首先我为
<div>
元素设置了一个引用,因为我们会多次调用它。
之后我通过
addEventListener()
函数设置了
click
事件,并将
Falta()
函数作为引用传递(没有括号)。
我还删除了更新变量名时使用的第二个
var
关键字,它应该只用于声明变量,而不是每次更改变量值时都使用。
最后我将
Falta()
函数作为引用传递给
setTimeout()
,而不是执行它。
希望这有帮助!
注意:
值得注意的是,
JSFiddle
会自动将您的代码包装在
window.onload
事件中,因此将您的代码传输到另一个环境可能不起作用,因为它不会等待
DOM
加载后再搜索
<div>
元素。
undefined
2015-12-21
改用
var t = setTimeout(Falta, 500)
。注意调用没有括号
jsonb.uy
2015-12-21
您正在
调用
setTimeout
函数中的
Falta
函数;您需要传递函数名称。其他一切都没问题:只需将
var t = setTimeout(Falta(), 500)
更改为
var t = setTimeout(Falta, 500);
。
请务必小心使用分号。
Hatchet
2015-12-21