为什么我不能读取嵌套函数中全局变量的变化
Why I can't read the change of global variables in a nested function?
//这是一个关于嵌套函数和计时器函数的代码问题
var num = 0; //the key of this problem
var timer = null;
timer = setInterval(function() {
//num could change from 0 to 9 in this function
console.log(num);
setTimeout(function() {
console.log(num); //but in this place, num is always 0,why?
}, 2000);
num++;
if (num >= 10) {
num = 0;
clearInterval(timer);
}
}, 100);
你是为什么我不能在嵌套函数中读取全局变量的变化?
。这只是一个逻辑错误,当您的setTimeout
回调发生时,您已经将其back设置为0:您每100ms增加num
,当它达到10时将其设置为0,然后停止增量过程。2000ms后,显示num
的值。在这一点上,它将是0,因为它在100毫秒间隔的10次循环后达到0,提前了一秒。
换句话说,事情是这样的:
- 时间0ms:设置
num
为0 - 时间0ms:您设置了一个重复间隔计时器(
setInterval
)在100ms - 时间~100ms:间隔第一次触发:
- 设置2000ms后的第一个回调
- 将
num
改为1
- 时间~200ms:间隔触发第二次:
- 设置2000ms后的第一个回调
- 将
num
改为2
- 在~300ms (num -> 3)、~400ms (num -> 4)、~500ms (num -> 5)、~600ms (num -> 6)、~700ms (num -> 7)、~800ms (num -> 8)、~900ms (num -> 3)
- 时间~1000ms:间隔最后一次触发:
- 设置2000ms后的另一个回调
- 设置num为10,然后为0并取消间隔
- 时间~2100ms:第一个
setTimeout
回调触发,显示num = 0 - 时间~2200ms:第二个
setTimeout
回调触发,显示num = 0 - …等等
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 从Javascript方法返回全局变量
- AngularJS中的封装窗口全局变量
- javascript隐式全局变量
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 如何使全局变量仅特定于该文件
- 在page.open()-PhantomJS中无法访问全局变量
- 使用全局变量来存储数字(JavaScript)
- 如何将变量声明为全局变量
- 在节点中创建文件全局变量
- 在Javascript中使用全局变量作为缓存是很好的
- 创建要在其他函数中使用的全局变量
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 原型取决于全局变量(如果该变量发生变化怎么办)
- 全局变量不't随jquery函数变化
- 当javascript中的条件变量(全局变量)发生变化时,停止循环
- 为什么我不能读取嵌套函数中全局变量的变化