Javascript 单击按钮后清除超时

Javascript 单击按钮后清除超时,javascript,function,timeout,Javascript,Function,Timeout,我目前正在尝试编写类似于tamagotchi“护理错误”的代码 在本例中,我试图创建一个函数来检查对象的饥饿状态是否高于或等于10。一旦发生这种情况,计时器将启动,如果10秒后计时器保持在10以上,将被记录为“错误” 但是,如果用户执行另一个操作,将饥饿感降低到10以下,它将清除计时器 尽管尝试了下面的代码,但我现在无法正确清除计时器 var changeHungerMood = setInterval(mistakeCheck, 5000); function mistakeCheck()

我目前正在尝试编写类似于tamagotchi“护理错误”的代码

在本例中,我试图创建一个函数来检查对象的饥饿状态是否高于或等于10。一旦发生这种情况,计时器将启动,如果10秒后计时器保持在10以上,将被记录为“错误”

但是,如果用户执行另一个操作,将饥饿感降低到10以下,它将清除计时器

尽管尝试了下面的代码,但我现在无法正确清除计时器

var changeHungerMood = setInterval(mistakeCheck, 5000);

function mistakeCheck() {
    var mistakeTimer
    function addMistake() {
        stats.mistakes += 1;
    }
    if (stats.hunger >= 10) {
        var mistakeTimer = setTimeout(addMistake, 10000);
    } else {
        clearTimeout(mistakeTimer);
        console.log("Mistake Cleared!");
    }
}


minmaxHunger("hunger", 10, 0);

目前,即使检查后饥饿感下降到10以下,计时器也不会被清除,并且仍然被记录为错误。有人能帮忙吗?谢谢。

您应该澄清在每种情况下需要完成的任务。 非常迫切地,您需要:

  • 如果要在
    stats.hunger>=10
    时设置计时器,您做得很好(除了您用
    var
    声明了两次
    mistakeTimer
    ,跳过第二次
    var
  • 当10秒结束时,您需要检查
    addmission
    是否仍然
    10
    或更多,而不是调用
    addmission
    ,如果是这样,请调用
    addmission
    函数
  • 因此,您需要添加一个函数
    addMistakeIfNeeded
    ,该函数执行检查并在需要时调用
    addmission
    。您的计时器应该调用这个
    addMistakeIfNeeded
    函数,而不是
    addmission


    而且@Jonas是对的,你需要把
    addmission
    addMistakeIfNeeded
    mistakeCheck
    函数中去掉。

    你应该澄清在每种情况下你需要完成什么。 非常迫切地,您需要:

  • 如果要在
    stats.hunger>=10
    时设置计时器,您做得很好(除了您用
    var
    声明了两次
    mistakeTimer
    ,跳过第二次
    var
  • 当10秒结束时,您需要检查
    addmission
    是否仍然
    10
    或更多,而不是调用
    addmission
    ,如果是这样,请调用
    addmission
    函数
  • 因此,您需要添加一个函数
    addMistakeIfNeeded
    ,该函数执行检查并在需要时调用
    addmission
    。您的计时器应该调用这个
    addMistakeIfNeeded
    函数,而不是
    addmission


    而且@Jonas是对的,您需要将
    addmission
    addMistakeIfNeeded
    mistakeCheck
    函数中删除。

    每次调用mistakeCheck时,您都要重新定义mistakeTimer。我相信这就是你的问题所在。因此,当您运行clearTimeout(mistakeTimer)时,它与启动倒计时的计时器不同。每次调用mistakeCheck时,您都在重新定义mistakeTimer。我相信这就是你的问题所在。因此,当您运行clearTimeout(mistakeTimer)时,它与启动倒计时的计时器不同。