我是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
。
然而,x
从3
更改为6
,然后保持在6
。
我不知道有关于JavaScript的东西吗? 这会阻止结果改变吗?
另外,奇怪的是,如果我把console.log("hi")
放在for循环之后,
控制台在slowDouble
运行之前打印出“hi”。
slowDouble
之前不应console.log("hi")
运行吗?
或者是否有setTimeout
的某些内容我无法正确理解?
谢谢!
答案 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
的值对这些调用没有影响。