for循环中的setTimeout,变量不变

setTimeout in a for loop, variable not changing

本文关键字:变量 setTimeout 循环 for      更新时间:2023-09-26

我是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);
});

逻辑告诉我在CCD_ 1中,在for循环中,x应该正在更改。并且每次在随后的for循环迭代中再次调用CCD_ 3时,x应该不同。但x仍保持在3!事实上,callback(x)中得到的答案应该是3072。然而,xslowDoubleTenTimes0变为6,然后保持在6

JavaScript有什么我不知道的吗这阻止了结果的改变?

而且,奇怪的是,如果我把console.log("hi")放在for循环之后,控制台在slowDouble运行之前打印出"hi"。slowDouble不应该在console.log("hi")之前运行吗?还是setTimeout有什么我没有正确理解的地方?

谢谢!

slowDouble不阻塞。因此,"回调"被立即调用。

setTimeout表示,"在500毫秒内运行此函数"。但是,它不会阻塞,这意味着它在500毫秒内注册调用后继续到下一行。

  • 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);
});

您立即调用slowDoubleTenTimesx值为3,然后调用slowDouble 10次,每次调用都将x的值传递为3。大约500毫秒后,您的回调被调用以更改x的值,并且由于对slowDouble的其他调用已经被调用,因此更改x的值对这些调用没有影响。