【问题标题】:Can't clearInterval on my script, but why?Can\'t clearInterval 在我的脚本上,但为什么呢?
【发布时间】:2022-08-19 04:48:12
【问题描述】:

我正在尝试用 JS 开发一个简单的回合制游戏,我需要让那些战斗交互有一些延迟。

在玩家按下“Battle!”后,我正在使用 setInverval 自动执行所有操作,但是当检查他是否还活着时,我的 clearInterval 不起作用 - 进程仍在后台运行 o_o

    const player = {
    hp: 0,
    state: true
}

const enemy = {
    hp: 100,
    state: true
}

function checkHp() {
    if(player.hp === 0 || enemy.hp === 0){
        const start = setInterval(function() {
            console.log(\'Checando turnos...\'),
            battle()
        }, 2000)
        return start
    } else {
        clearInterval(start)
        console.log(\'Você precisa descansar!\')
    }
}

function battle() {
    turn = 0
    turn = Math.floor(Math.random () * 2)
    console.log(turn)
}

checkHp()
  • start 超出范围。它在if 语句的一个分支中声明,但您在另一个分支中使用它。

标签: javascript


【解决方案1】:

正如其他人指出的那样,start 在您尝试使用它来清除间隔时超出范围。让我们分解一下您的代码在做什么:

function checkHp() {
    if(player.hp === 0 || enemy.hp === 0){
        // start is defined here in the scope of this block
        const start = setInterval(function() {
            console.log('Checando turnos...'),
            battle()
        }, 2000)
        // it is returned from the function here
        return start
    } else {
        // start has never been defined inside the else block, so it
        // has a value of undefined
        clearInterval(start)
        console.log('Você precisa descansar!')
    }
}

阅读variable scoping in javascript 可能会有所帮助。

稍后在脚本中调用checkHp,但不保存返回值,如果它进入if 块或undefined 如果你进入else 块,则它是间隔句柄,你没有返回一个值。

现在,该怎么办?似乎您可能正在尝试设置一个在某些条件下自行清除的间隔。您可以查看this answer 以获得一些建议。

【讨论】:

  • 谢谢!我认为 if/else 有一个共享范围,我会尝试弄清楚如何解决它 - 更清楚为什么我使用 js 做一些简单的事情失败了:P
【解决方案2】:

clearInterval 不能用于 undefined 参数。将start 变量置于if 条件之外,以使clearInterval 起作用。从


function checkHp() {
    if(player.hp === 0 || enemy.hp === 0){
        const start = setInterval(function() {
            console.log('Checando turnos...'),
            battle()
        }, 2000)
        return start
    } else {
        clearInterval(start)
        console.log('Você precisa descansar!')
    }
}



function checkHp() {
// this line new added
const start;
    if(player.hp === 0 || enemy.hp === 0){
// this line will edited
        start = setInterval(function() {
            console.log('Checando turnos...'),
            battle()
        }, 2000)
        return start
    } else {
        clearInterval(start)
        console.log('Você precisa descansar!')
    }
}

clearInterval 总是像 setInterval 被分配了变量一样工作。所以start 变量应该首先从if 条件中赋值。

Javascript 变量可以具有全局作用域,也可以具有局部作用域。局部范围在全局范围内不可触及,但全局范围变量可以在局部范围内使用。这些范围可以通过functionif 和其他带有大括号的方法({})来决定。我们可以看一个例子,


let a = 'apple'

function printA() {

//will console apple in this local function
console.log(a)

return
}

printA();

上面的例子apple可以在函数中进行安慰,


let a;

function asignA() {

a = 'banana'

return
}

printA();

//this will console apple still in global scale
//will not console banana 
//because asigning banana was declared in local scope
console.log(a)

在这个例子中,分配的banana 不能被调出函数。

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多