为什么计数正确递增
Why is count correctly incremented
本文关键字:为什么 更新时间:2023-09-26
考虑这个简单的例子:
var count = 0;
for (var i = 0; i < 4; i++ ) {
setTimeout(function() {
console.log(i, count++);
}, i * 200);
}
输出以下内容
4 0
4 1
4 2
4 3
我猜i
总是解析为 4,因为 setTimeout 回调在变量 I 上关闭,但我无法弄清楚为什么同样不适用于count
?
var count = 0;
for (var i = 0; i < 4; i++ ) {
setTimeout(function() {
console.log(i, count++);
}, i * 2000 );
}
变量i
按for
循环递增,并在任何超时处理程序运行之前以值4
结束。另一方面,变量count
仅在超时处理程序内递增。当第一个超时处理程序触发时,count
仍将0
。
正如我之前的小伙子们所说,这是因为循环在激活超时之前完成。
解决此问题的一种方法是将超时放在不同的函数中,并从循环中将i
传递给它。这可确保每次迭代都为函数传递正确的i
这也是为什么count
设置为期望值的原因;它位于循环的范围之外。
for (var i = 0; i < 4; i++) {
doSomething(i);
};
function doSomething(i) {
setTimeout(function() {
console.log(i);
}, i * 2000);
};
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 为什么“;未定义的“;在JavaScript中结束循环
- 为什么这在IE中的工作方式与在Firefox中不同
- 知道为什么我的旋转木马不会自动更改图片吗
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 为什么在变形之前不缺少Fx
- 为什么JavaScript在for循环为3时向所有4发出警报
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- 为什么Airbnb风格指南说不鼓励依赖函数名称推断
- 为什么要使用0>javascript中的0
- 为什么无法在TypeScript中导出类实例
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 为什么我的d3.jsselectAll+过滤器没有过滤
- 为什么HTML5拖放的目标是孩子?(可排序列表)
- 为什么忽略了eval()代码中的语法错误
- 为什么在画布上画线;t出现
- 为什么js事件消失了
- 为什么元素的宽度在页面加载之后和那一刻之后不同
- 为什么不'在JQuery中找到第二个css选择器的工作