for循环中的setTimeout,变量不变
setTimeout in a for loop, variable not changing
我是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
。然而,x
从slowDoubleTenTimes
0变为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);
});
您立即调用slowDoubleTenTimes
,x
值为3
,然后调用slowDouble
10次,每次调用都将x
的值传递为3
。大约500毫秒后,您的回调被调用以更改x
的值,并且由于对slowDouble
的其他调用已经被调用,因此更改x
的值对这些调用没有影响。
- Angularjs 更新 setTimeout 中的范围变量不起作用
- 被覆盖的 setTimeout 变量中的函数
- nodejs-settimeout是否在不同的循环中共享变量
- toString似乎导致setTimeout不总是为toString的变量参数执行函数
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 变量在Javascript中是如何工作的?可以在setTimeout期间更改变量值
- Javascript setTimeout作用域引用了错误的变量
- 一旦超时执行,清除或重新分配分配给 setTimeout 返回值的变量是否有任何技术点
- 使用变量作为 setInterval / setTimeout 中的时间
- 如何将变量传递到 setTimeout 函数中
- 为什么这个全局计数器变量不适用于 setTimeout
- JavaScript setTimeout可以't访问函数变量
- 如何在setTimeout中维护循环变量的值?Javascript
- Angular2,视图在settimeout变量更改后未更新
- 将对象内的变量传递到setTimeout
- javascript setTimeout()输出另存为变量
- for循环中的setTimeout,变量不变
- setTimeout似乎正在更改我的变量!为什么?
- setTimeout给了我新的变量,而不是旧的
- 如何从iframe(Javascript)中撤销setTimeout变量