解决js setTimeout多参数问题与实例详解
版权申诉
68 浏览量
更新于2024-08-18
收藏 16KB DOCX 举报
在JavaScript中,`setTimeout` 方法是一个非常实用的功能,它允许我们在指定的时间后执行一段代码。这个方法的基本语法是:`setTimeout(func, delay)`,其中 `func` 是要执行的函数,`delay` 是延迟执行的时间,单位为毫秒。
在文档中提到,通常情况下,`setTimeout` 方法不带参数时直接调用,如下面的例子:
```javascript
function timedMsg() {
var a = "dd";
setTimeout(function() {
cao(a);
}, 3000);
}
function cao(a) {
alert(a);
}
document.querySelector('input[type="button"]').addEventListener('click', function() {
timedMsg();
});
```
这个例子中,点击按钮后会在3秒后弹出一个警告框,显示字符串 "dd"。
然而,文档中的问题在于,当尝试在一个循环中使用 `setTimeout` 并且希望每个元素都独立执行时,出现了问题。原代码尝试通过 `setTimeout` 的延迟时间与循环变量 `i` 相关联,期望每个元素每2秒钟执行一次,但实际执行顺序只有最后一个。这源于在 `setTimeout` 函数内部,`i` 的值在延迟执行时已经固定为最后一次循环的值(这里是4)。
为了解决这个问题,引入了一个名为 `replayi` 的变量来跟踪当前执行的位置,并使用递归函数 `xunhuanlian`,这样确保了每个元素按照预期顺序执行,同时避免了重复执行。修正后的代码如下:
```javascript
var timerr;
function xunhuanlian(points, value) {
if (replayi < points.length) {
AddGuiJi(points[replayi], value);
replayi++;
timerr = setTimeout(function() {
xunhuanlian(points, value);
}, 1000);
} else {
replayi = 0;
clearTimeout(timerr);
}
}
// 原来的 for 循环已被替换为递归调用
// for(var i = 0; i < points.length; i++) {
// AddGuiJi(points[i], value);
// // vart = setTimeout(function(){AddGuiJi(points[i], value);}, 2000 * i);
//}
```
通过这种方式,`xunhuanlian` 在每次循环结束后重新设置 `setTimeout`,使得每个 `points` 中的元素依次执行,而不是仅执行最后一个。
理解 `setTimeout` 的工作原理和正确使用其递归版本,对于处理异步操作和避免代码行为的混淆至关重要。掌握这种技巧有助于编写更高效、可维护的JavaScript代码。
2022-01-21 上传
2022-01-22 上传
2022-01-13 上传
2021-10-09 上传
2021-10-09 上传
2022-01-21 上传
2022-01-18 上传
2021-12-16 上传
2022-11-26 上传
惚如远行客
- 粉丝: 0
- 资源: 5209
最新资源
- BottleJS快速入门:演示JavaScript依赖注入优势
- vConsole插件使用教程:输出与复制日志文件
- Node.js v12.7.0版本发布 - 适合高性能Web服务器与网络应用
- Android中实现图片的双指和双击缩放功能
- Anum Pinki英语至乌尔都语开源词典:23000词汇会话
- 三菱电机SLIMDIP智能功率模块在变频洗衣机的应用分析
- 用JavaScript实现的剪刀石头布游戏指南
- Node.js v12.22.1版发布 - 跨平台JavaScript环境新选择
- Infix修复发布:探索新的中缀处理方式
- 罕见疾病酶替代疗法药物非临床研究指导原则报告
- Node.js v10.20.0 版本发布,性能卓越的服务器端JavaScript
- hap-java-client:Java实现的HAP客户端库解析
- Shreyas Satish的GitHub博客自动化静态站点技术解析
- vtomole个人博客网站建设与维护经验分享
- MEAN.JS全栈解决方案:打造MongoDB、Express、AngularJS和Node.js应用
- 东南大学网络空间安全学院复试代码解析