javascript - 澄清 setTimeout 和 forloop 交互的工作原理
问题描述
我无法理解为什么答案是 9。根据我的理解,将setTimeout
函数添加到 for 循环中意味着该setTimeout
函数将在每个循环中运行 3 次。所以它循环了 3 次,在每个循环中,setTimeout
运行 3 次,总共 9 次?我缺少理解。
var result = 0;
for (var i = 0; i < 3; i++) {
setTimeout(function() {
result += i;
}, 1000);
}
console.log(result) // answer is 9
解决方案
Javascript是一个单线程系统。setTimeout
基本上将您的请求放在调用堆栈上以在 1 秒后执行。它仍然在你的函数范围内被触发,但在它结束时,有 1 秒的延迟。在你的函数结束时,i === 3
因为你执行了 3 次,你会得到result === 9
如果您这样做,您可以更清楚地看到这一点:
var result = 0;
for (var i = 0; i < 3; i++) {
setTimeout(function() {
result += i;
console.log("i: " + i);
console.log("result: " + result)
}, 1000);
}
您可以结束超时,以打破对i
. 通过放置setTimeout
一个函数并传递i
给它来做到这一点。这样,它是什么并不重要i
,因为我们使用j
的是新函数内部的作用域。
var result = 0;
for (var i = 0; i < 3; i++) {
(function(j){
setTimeout(function() {
result += j;
console.log("i: " + i);
console.log("j: " + j);
console.log("result: " + result)
}, 1000);
})(i);
}
推荐阅读
- javascript - CodeSignal 不同的平方更有效
- python - 我可以在控制台错误中访问请求对象吗?
- java - 在所有 Junit 测试类中使用方法
- c# - 如何防止在大约 1000 个请求中发生 1 个的 HttpClient TaskCancelled 异常?
- javascript - 访问第三级 JSON 对象的 Google App 脚本
- python - Python:如何将声音设备麦克风输入发送到烧瓶
- php - 没有特殊字符的php文件搜索
- linux - 有没有办法像自动热键一样将字符串作为击键发送?
- python - 添加新行重置添加的列计算
- python - 是否有相当于为字典附加条件列表的字典理解?