function formatDate(date){ date = date || new Date(); console.log(date.getFullYear()+"-"+(date.getMonth()+1)+date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds()+":"+date.getMilliseconds()); } var timer ; function test(){ timer = setTimeout(function(){ formatDate(); console.log('timeout'); },10000); var startDate = new Date(); var now = new Date(); for(var i =0; i<5; i++){ formatDate(startDate); // 5 second while(new Date () - startDate < 5*1000){ } startDate = new Date(); } formatDate(); console.log('test finished'); } test();
猜想:
A.定时器timeout启动时刻为JS运行时执行到setTimeout时开始,
B.定时器timeout在JS运行时执行完主逻辑后开始计时
针对如上测试用例,我们发现主逻辑大概执行5×5=25秒,定时器设定为10秒后执行,
如果猜想A成立,那么主逻辑执行完毕以后,基本上立刻执行定时器逻辑,无需等待
如果猜想B成立,那么主逻辑执行完25秒后,再过10秒执行定时器逻辑
在chrome下测试,发现A逻辑成立
如果将定时器时间间隔设置为30秒,那么主逻辑执行完毕以后,大概过5秒,执行定时器逻辑,进一步验证A猜想成立
在整个过程中,其实不难发现,setTimeout能够保证回调逻辑在timeout设置时间后执行,与setInterval相比,起码保证了最小时间间隔