请用 JavaScript 编写代码,实现每秒钟依次输出数字 1、2、3、4。给出具体实现。
考察说明
考查候选人对 JavaScript 异步编程中定时器或事件循环的理解,以及实现间歇性任务的能力。
回答思路
- 【回答框架 1】最简单的方式是使用 setInterval 结合一个计数器变量:每 1000 毫秒执行一次回调,每次打印计数器并加一,当计数达到 4 时清除定时器。注意变量自增时机,确保打印 1,2,3,4。
- 【回答框架 2】另一种常见做法是使用 setTimeout 嵌套:在回调函数内再次调用 setTimeout,并传入下一轮的延时,这样实现了固定间隔的递归定时。需要额外管理终止条件,例如当数字大于 4 时不再继续。
- 【回答框架 3】除了定时器,还可以部署 async/await 配合 Promise 延迟函数:编写一个 delay 函数返回 Promise,然后在 for 循环中 await delay(1000) 并打印数字。这种方式更符合现代异步编程风格,代码关注点更清晰。
- 【回答框架 4】若采用 setInterval,需要注意变量作用域,建议使用 let 声明计数变量,并确保在清除定时器之前最后一次打印正常,避免多打印或漏打印。同时,setInterval 可能受执行环境影响,但本例为简单示例,无严重风险。
- 【回答框架 5】最后比较各方案:setInterval 简单直接但需要手动清除;setTimeout 嵌套更灵活,可避免回调堆积;async/await 更易读和测试。应根据实际项目场景选择,对于间歇性任务,固定间隔用 setInterval,递归或可调整间隔用 setTimeout。
- 【关键点 1】setInterval 结合计数器并清除定时器是实现固定间隔打印的基础方案。
- 【关键点 2】setTimeout 递归或 async/await 循环可达成同样效果,且更易控制。
- 【关键点 3】使用 let 声明计数器避免作用域问题,保证输出为 1,2,3,4。
- 【关键点 4】注意清除定时器时机,防止额外打印。
- 【关键点 5】实际项目中优先考虑代码可读性和可维护性。
- 【易错点 1】setInterval 中未清除定时器会导致无限循环。
- 【易错点 2】计数变量使用 var 可能产生作用域问题,导致值不正确。
- 【易错点 3】async/await 方案中遗漏 await 会使循环立即执行,失去间隔效果。