Javascript 为什么我能';t读取嵌套函数中全局变量的变化?

Javascript 为什么我能';t读取嵌套函数中全局变量的变化?,javascript,nested-function,Javascript,Nested Function,//这是一个关于嵌套函数和计时器函数的代码问题 var num=0//这个问题的关键 var定时器=null; 计时器=设置间隔(函数(){ //此函数中的num可以从0更改为9 console.log(num); setTimeout(函数(){ console.log(num);//但是在这里,num总是0,为什么? }, 2000); num++; 如果(num>=10){ num=0; 清除间隔(计时器); } }, 100); 为什么我不能读取嵌套函数中全局变量的变化 你是。这只是一

//这是一个关于嵌套函数和计时器函数的代码问题
var num=0//这个问题的关键
var定时器=null;
计时器=设置间隔(函数(){
//此函数中的num可以从0更改为9
console.log(num);
setTimeout(函数(){
console.log(num);//但是在这里,num总是0,为什么?
}, 2000);	
num++;
如果(num>=10){
num=0;
清除间隔(计时器);
}
}, 100);
为什么我不能读取嵌套函数中全局变量的变化

你是。这只是一个逻辑错误,当您的
setTimeout
回调发生时,您已经将其设置回0:您每100ms递增一次
num
,当它达到10时将其设置为0,然后停止递增过程。2000ms后,显示
num
的值。在这一点上,它将是0,因为它在以100ms的间隔进行10次循环后达到了0,比前一秒早

换言之,发生的情况如下:

  • 时间0ms:将
    num
    设置为0
  • 时间0ms:将重复间隔计时器(
    setInterval
    )设置为100ms
  • 时间~100ms:第一次点火间隔:
  • 它设置2000毫秒后的第一次回调
  • num
    更改为1
  • 时间~200ms:间隔第二次点火:
  • 它设置2000毫秒后的第一次回调
  • num
    更改为2
  • 这种情况在~300ms(num->3)、~400ms(num->4)、~500ms(num->5)、~600ms(num->6)、~700ms(num->7)、~800ms(num->8)、~900ms(num->3)时再次发生
  • 时间~1000ms:上次点火的间隔:
  • 它设置了2000毫秒后的另一个回调
  • 它将num设置为10,然后设置为0并取消间隔
  • 时间~2100ms:第一次
    setTimeout
    回调触发,显示num=0
  • 时间~2200ms:第二次
    setTimeout
    回调触发,显示num=0
  • ……等等
  • 为什么我不能读取嵌套函数中全局变量的变化

    你是。这只是一个逻辑错误,当您的
    setTimeout
    回调发生时,您已经将其设置回0:您每100ms递增一次
    num
    ,当它达到10时将其设置为0,然后停止递增过程。2000ms后,显示
    num
    的值。在这一点上,它将是0,因为它在以100ms的间隔进行10次循环后达到了0,比前一秒早

    换言之,发生的情况如下:

  • 时间0ms:将
    num
    设置为0
  • 时间0ms:将重复间隔计时器(
    setInterval
    )设置为100ms
  • 时间~100ms:第一次点火间隔:
  • 它设置2000毫秒后的第一次回调
  • num
    更改为1
  • 时间~200ms:间隔第二次点火:
  • 它设置2000毫秒后的第一次回调
  • num
    更改为2
  • 这种情况在~300ms(num->3)、~400ms(num->4)、~500ms(num->5)、~600ms(num->6)、~700ms(num->7)、~800ms(num->8)、~900ms(num->3)时再次发生
  • 时间~1000ms:上次点火的间隔:
  • 它设置了2000毫秒后的另一个回调
  • 它将num设置为10,然后设置为0并取消间隔
  • 时间~2100ms:第一次
    setTimeout
    回调触发,显示num=0
  • 时间~2200ms:第二次
    setTimeout
    回调触发,显示num=0
  • ……等等