使用setInterval执行函数异常:满足条件后无法按预期定时执行
问题分析与修复
你的代码问题出在这几点:
enemyAttack2应该是在游戏循环这类高频执行的逻辑里被反复调用的吧?每次满足enemy.y > 195时,你都会新建一个setInterval,然后立刻调用clearInterval把它清掉——这等于白创建,定时器根本没机会执行。- 更糟的是,如果
enemyAttack2被多次触发,每次都会创建新的定时器,之前的定时器没被清除的话,就会堆积起来,到时间后一堆定时器同时触发,导致enemyAttack1被快速重复执行。
修复方案
核心思路是用一个外部变量追踪定时器状态,确保只创建一次定时器,条件不满足时再清除。
修正后的代码
// 把定时器变量放在外部,避免每次调用enemyAttack2都重新声明 let strikeTimer = null; function enemyAttack1() { playerHealth -= enemyStrike; }; function enemyAttack2() { if (enemy.y > 195) { // 只有当定时器还没创建的时候,才启动新的定时器 if (!strikeTimer) { strikeTimer = setInterval(enemyAttack1, 3000); } } else { // 条件不满足时,清除定时器并重置变量 if (strikeTimer) { clearInterval(strikeTimer); strikeTimer = null; } } };
代码说明
strikeTimer作为全局(或模块级)变量,用来记录当前是否有活跃的攻击定时器。- 当
enemy.y > 195且没有活跃定时器时,才创建新的setInterval,避免重复创建。 - 当敌人位置不满足条件时,清除已有的定时器,并把
strikeTimer重置为null,方便后续重新触发。
这样就能保证满足条件时,每3秒只执行一次 enemyAttack1,条件不满足时停止攻击。
内容的提问来源于stack exchange,提问作者partial
相关产品推荐
相关产品推荐

