为什么我不能读取嵌套函数中全局变量的变化

Why I can't read the change of global variables in a nested function?

本文关键字:全局变量 变化 函数 嵌套 不能 不能读 读取 为什么      更新时间:2023-09-26

//这是一个关于嵌套函数和计时器函数的代码问题

    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,提前了一秒。

换句话说,事情是这样的:

  1. 时间0ms:设置num为0
  2. 时间0ms:您设置了一个重复间隔计时器(setInterval)在100ms
  3. 时间~100ms:间隔第一次触发:
    1. 设置2000ms后的第一个回调
    2. num改为1
  4. 时间~200ms:间隔触发第二次:
    1. 设置2000ms后的第一个回调
    2. num改为2
  5. 在~300ms (num -> 3)、~400ms (num -> 4)、~500ms (num -> 5)、~600ms (num -> 6)、~700ms (num -> 7)、~800ms (num -> 8)、~900ms (num -> 3)
  6. 时间~1000ms:间隔最后一次触发:
    1. 设置2000ms后的另一个回调
    2. 设置num为10,然后为0并取消间隔
  7. 时间~2100ms:第一个setTimeout回调触发,显示num = 0
  8. 时间~2200ms:第二个setTimeout回调触发,显示num = 0
  9. …等等