rev*_*rev 75 javascript infinite-loop single-threaded
我想知道JavaScript while语句(在Chrome控制台中)可以在几毫秒内递增一个变量多少次,所以我很快将这个片段直接写入控制台:
var run = true, i = 0;
setTimeout(function(){ run = false; }, 1);
while(run){ i++; }
Run Code Online (Sandbox Code Playgroud)
问题是它会永远运行.
为什么会发生这种情况,我该如何解决?
Sir*_*rko 80
这又回到了JavaScript 1的单线程特性.发生的事情几乎是这样的:
run = false.这是计划运行后,目前的功能是运行(或任何其他当前处于活动状态).setTimeout()将执行回调run=false.如你所见,一种setTimeout()方法在这里不起作用.您可以通过检查while条件中的时间来解决这个问题,但这会篡改您的实际测量值.
1至少为了更实际的目的,您可以将其视为单线程.实际上有一个所谓的"事件循环".在该循环中,所有函数都会排队,直到它们被执行.如果排队新函数,则将其放在该队列中的相应位置.在当前函数完成之后,引擎从队列中获取下一个函数(关于引入的时序,例如,通过setTimeout()并执行它.
结果在每个时间点只执行一个函数,从而使执行相当事件有一些例外情况,在下面的链接中讨论.
以供参考:
这里更详细地解释了类似的情况
更深入地描述JS何时可以被视为单线程,何时不被视为单线程.
lau*_*ent 24
JavaScript是单线程的,所以当你在循环中时,没有其他任何东西被执行.
Syn*_*AMP 19
要保持Chrome的真正速度而不必经常检索计算速度的时间,您可以尝试以下JS代码:
var start = new Date().getTime()
var i = 0
while(i<1000000)
{
i++
}
var end = new Date().getTime()
var delta = end-start
var speed = i/delta
console.log(speed + " loops per millisecond")
Run Code Online (Sandbox Code Playgroud)