开发者问题收集

未捕获的 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