for循环中的setTimeout,变量不变

时间:2013-08-10 04:50:00

标签: javascript

我是JavaScript的初学者,我一直试图解决这个问题至少两个小时。如果有人能向我解释为什么会这样,那就太好了!

function slowDouble(x, callback) {
    setTimeout(function() {
    callback(2 * x);
  }, 500);
}

function slowDoubleTenTimes(x, callback) {
    for (i = 0; i < 10; i++) {
        slowDouble(x, function(result) {
            x = result;
        });
    }

    callback(x);
}

slowDoubleTenTimes(3, function(result){
  console.log('The result of slowDoubleTenTimes is ' + result);
});

逻辑告诉我在slowDoubleTenTimes, 在for循环中,x应该改变。 每次在后续的for循环迭代中再次调用slowDouble时, x应该是不同的。 但是x仍在3! 事实上,callback(x)中的结果答案应为3072。 然而,x3更改为6,然后保持在6

我不知道有关于JavaScript的东西吗? 这会阻止结果改变吗?

另外,奇怪的是,如果我把console.log("hi")放在for循环之后, 控制台在slowDouble运行之前打印出“hi”。 slowDouble之前不应console.log("hi")运行吗? 或者是否有setTimeout的某些内容我无法正确理解?

谢谢!

3 个答案:

答案 0 :(得分:0)

slowDouble不会阻止。因此,立即调用“回调”。

setTimeout说,“在500毫秒内运行此功能”。但是,它不会阻塞,这意味着它在注册后在500毫秒内被调用后继续到下一行。

答案 1 :(得分:0)

  • JavaScript引擎只有一个线程,强制异步 排队等待执行的事件。

  • 如果计时器被阻止立即执行,则会延迟 直到下一个可能的执行点(将比...更长) 期望的延迟)。

http://ejohn.org/blog/how-javascript-timers-work/

function slowDouble(x, callback) {
    setTimeout(function() {
    callback(2 * x);
  }, 500);
}

function slowDoubleTenTimes(x, callback) {
    for (i = 0; i < 10; i++) {
        slowDouble(x, function(result) {
            x = result;
        });
    }

    callback(x);  //This will get called before the callback from timeout
                  // in slowDouble's context is called. 
                  // console.log(3)

}

slowDoubleTenTimes(3, function(result){
  console.log('The result of slowDoubleTenTimes is ' + result);
});

答案 2 :(得分:0)

您立即使用slowDoubleTenTimes x值调用3,然后调用slowDouble 10次,每次调用都将x的值传递为{ {1}}。大约500 ms后,您的回调被调用以更改3的值,并且由于已调用x的其他调用,更改slowDouble的值对这些调用没有影响。