如何在JavaScript中每分钟比较两个日期变量并触发指定函数?(代码未执行目标函数问题排查)
问题分析与修复方案
嘿,我一眼就瞅到问题出在哪了!你定义的current变量是脚本刚启动时的固定时间,之后再也没更新过——每次执行myFunction的时候,你都是拿脚本初始化那一刻的时间和endtime对比,这肯定永远触发不了doing()啊!
修复后的完整代码
var endtime = new Date(Date.now() + 2 * 60 * 1000); hours = ('0' + endtime.getHours()).slice(-2); mins = ('0' + endtime.getMinutes()).slice(-2); secs = ('0' + endtime.getSeconds()).slice(-2); var gametime = hours + ":" + mins + ":" + secs; $('#endtime').html(gametime); var i = setInterval(function () { myFunction(); }, 60000); function myFunction() { // 关键修改:实时获取当前时间,而非使用初始化时的固定值 if (Date.now() >= endtime.getTime()) { doing(); } } function doing() { var body = $('#alert'); var colors = ['white', 'transparent']; var currentIndex = 0; setInterval(function () { light(); }, 400); // 优化循环逻辑,避免出现数组越界的情况 function light() { body.css({ backgroundColor: colors[currentIndex] }); currentIndex = (currentIndex + 1) % colors.length; } alert("Time's up!"); clearInterval(i); }
核心修改点说明
- 实时获取当前时间:删掉原代码里固定的
current变量,在myFunction里用Date.now()直接获取最新时间戳,和endtime.getTime()对比,保证每次检查都是当前真实时间。 - 优化颜色循环逻辑:原代码里的
currentIndex递增后会超出数组长度,改成取模运算(currentIndex + 1) % colors.length,能让索引在数组范围内循环,避免出现undefined的颜色值。 - 简化对比逻辑:直接用时间戳对比比反复创建
Date对象更高效,代码也更简洁。
另外提个小建议:如果想让触发更及时,可以把定时器间隔改小一点(比如1000毫秒,每秒检查一次),这样就不会因为每分钟检查一次而最多延迟一分钟执行。
内容的提问来源于stack exchange,提问作者Mohamed Yousef Khairlden
相关产品推荐
相关产品推荐

