代码之家  ›  专栏  ›  技术社区  ›  Guber Jan

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

  •  0
  • Guber Jan  · 技术社区  · 10 年前

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

        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 回复  |  直到 10 年前
        1
  •  5
  •   T.J. Crowder    10 年前

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

    setTimeout 回调发生时,您已经设置好了 返回 到0:您递增 num 每100ms,当达到10时将其设置为0,然后停止增量过程。2000毫秒后,您将显示

    换言之,情况如下:

    1. 时间0ms:您设置 号码 到0
    2. 时间0ms:您设置了重复间隔计时器( setInterval )100毫秒时
    3. 时间~100ms:间隔第一次点火:
      1. 它会在2000毫秒后设置第一个回调
      2. 变化 号码
      1. 它会在2000毫秒后设置第一个回调
      2. 变化 号码 至2
    4. 在约300毫秒(num->3)、约400毫秒(num->4)、约500毫秒(num->5)、约600毫秒(nug->6)、约700毫秒
    5. 时间~1000ms:上次点火间隔:
      1. 它在2000毫秒后设置了另一个回调
      2. 它将num设置为10,然后设置为0并取消间隔
    6. 时间~2100ms:第一次 设置超时 回调触发,显示num=0
    7. 时间~2200ms:秒 设置超时 回调触发,显示num=0
    8. 等等