今天了解了一下关于定时器setTimeout的知识。
js是单线程的,而定时器是计划在某个时间点进行的,不过没法保证确切的运行,因为很有可能js处于阻塞状态`
function test(){
var start=+new Date()
var c;
setInterval(function(){
var endInterval = +new Date()
console.log("定时器:"+(endInterval-start))
},2000)
for(var i=0;i<2000000000;i++){
c=c+i
}
var end = +new Date()
console.log("事件运行时间"+(end-start))
}
test()
可以看到尽管定时器早就被创建,可是等js空闲下来才执行,中间跳过了两次。另外,如果每次定时器中的代码运行事件大于定时器间隔会怎样呢?
function test() {
var start = +new Date()
var c;
setInterval(function () {
var endInterval = +new Date();
console.log("定时器:" + (endInterval - start));
for (var i = 0; i < 80000000; i++) {
c = c + i
};
var end = +new Date();
console.log("事件运行时间" + (end - start));
}, 2000)
}
test()
定时器代码执行结束后会立刻执行下个定时器代码。
另外,这里发现一个问题,虽然会立刻执行下个定时器代码,为什么中间会差几十毫秒或者几毫秒呢?我在javaScript高级程序设计中找到了这样一段话可能就是答案:
执行 完 一套 代码 后, JavaScript 进程 返回 一段很短 的 时间, 这样 页 面上 的 其他 处理 就可以 进行 了。 由于 JavaScript 进程 会 阻塞 其他 页面 处理, 所以 必须 有 这些 小 间隔 来 防止 用户 界面 被 锁定( 代码 长时间 运行 中 还有 可能 出现)。 这样 设置 一个 定时器, 可以 确保 在 定时器 代码 执行 前 至少 有一个 进程 间隔。
如果不希望代码间隔被漏掉,而且阻塞的js空闲后立刻执行setInterval定时器,可以有如下解决办法:
function test() {
var start = +new Date()
var c;
setTimeout(function () {
var endInterval = +new Date();
console.log("定时器:" + (endInterval - start));
for (var i = 0; i < 80000000; i++) {
c = c + i
};
var end = +new Date();
console.log("事件运行时间" + (end - start));
setTimeout(arguments.callee,2000);
}, 2000)
}
test()