为什么我无法读取嵌套函数中全局变量的变化?

时间:2016-08-21 03:33:54

标签: javascript 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);




1 个答案:

答案 0 :(得分:5)

  

为什么我无法读取嵌套函数中全局变量的变化?

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

换句话说,现在发生了什么:

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