我真的不明白在Javascript中使用setInterval()
时程序的控制流程
如果我们提供一个需要100ms时间的函数作为SetInterval()
方法的参数执行,时间为20ms,如下所示
setInterval(function{
for(var i=0;i<1000000;i++)
console.log(i)
},20);
当setInterval()
在20ms后再次调用它时,会发生什么?
thanx :)
添加 : 简单循环和使用setInterval进行循环和使用clearInterval进行停止之间的主要区别是什么? 检查此http://www.sitepoint.com/multi-threading-javascript/
答案 0 :(得分:1)
首先让我们从修复你的javascript开始,因为你有一些错过的右括号:
setInterval(function() {
for(var i = 0; i < 1000000; i++) {
console.log(i);
}
}, 20);
这相当于以下内容:
function loopAndDump() {
for(var i = 0; i < 1000000; i++) {
console.log(i);
}
}
setInterval(loopAndDump, 20);
或:
setInterval(function() { loopAndDump(); }, 20);
现在更容易理解会发生什么:loopAndDump
函数每隔20ms定期调用一次。此函数只是从0循环到1000000并将计数器转储到控制台。如果你想停止这个过程定期执行函数你可以使用stopInterval函数并将它作为参数传递给setInterval函数返回的结果。
如果您只想执行一次该功能,那么您可以使用setTimeout方法:
setTimeout(function() {
for(var i = 0; i < 1000000; i++) {
console.log(i);
}
}, 20);
现在循环只执行一次,在javascript解释器到达setTimeout行后20ms。
答案 1 :(得分:0)
20 ms后不会再次调用。
Javascript严格是单线程的,因此只要您的函数正在运行,就不会处理任何事件。间隔计时器将在20 ms后触发事件,但在功能完成之前不会处理。
答案 2 :(得分:0)
setInterval
是一个Javascript计时器。永远记住:在Javascript中,不保证定时器延迟。由于浏览器中的所有JavaScript都在单个线程上执行,因此异步事件仅在执行中打开时运行。
var some_function = function() {
for (var i=0; i < 1000000; i++) {
console.log(i);
}
};
setInterval(some_function, 20);
执行此示例时,JavaScript启动计时器,并在20ms内执行some_function
假设some_function
完成需要100毫秒,那么当函数完成执行后100分钟将发生的事情是JavaScript将环顾四周以查看等待执行的内容。
在setInterval
执行开始后约20ms,会收到另一个执行some_function
的请求(由setInterval
设置的计时器)。在收到命令时,由于JavaScript正忙于运行some_function
,因此无法执行。
由于没有任何阻止setInterval
操作再次发生,JavaScript将重新执行它。自setInterval计时器启动以来已经过了大约120毫秒,你的some_function
显然会背靠背地执行。