为什么setTimeout中s的第二个参数要设置成500毫秒

下面是简单时间显示代码:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>当前系统时间</title>
<link rel="stylesheet" href="style.css"  />
<script language="javascript" type="text/javascript">

  window.onload = function(){
    showTime();
  }
  function checkTime(i){  //补位处理
      return i < 10 ? "0" + i : i;



  }
  function showTime(){
    var now=new Date();
    var year=  now.getFullYear();
    var month=  now.getMonth() + 1;
    var day=  now.getDate();
    var h=  now.getHours();
    var m=  now.getMinutes();
    var s=  now.getSeconds();
    h=checkTime(h)
    m=checkTime(m)
    s=checkTime(s)

    var weekday=new Array(7)
    weekday[0]="星期日"
    weekday[1]="星期一"
    weekday[2]="星期二"
    weekday[3]="星期三"
    weekday[4]="星期四"
    weekday[5]="星期五"
    weekday[6]="星期六"

    document.getElementById("show").innerHTML= year+"年"+month+"月"+day+"日 "+  " " +h+":"+m+":"+s;
    t=setTimeout('showTime()',500)
  }

</script>
</head>
<body>
<div class="content1">
  <div id="show">显示时间的位置</div>
</div>
</body>
</html>

如果把setTimeout设置成1000会比实际时间慢一秒,这是为什么呢?

阅读 5.9k
6 个回答

t=setTimeout('showTime()',500);
setTimeout函数设置的延时n毫秒,JS单线程执行以及事件循环机制(EventLoop)并不能保证精确的在n毫秒后执行回调,只能保证至少在n毫秒后才能有机会被执行~~~~;

基于以上的JS实现,如果你想要接近于需要的时间执行,就想要减小时间颗粒度,比如你想要1000毫秒间隔,那就设置500ms,但是这个还是不精确的~~~

很简单啊,setTimeout这个函数是指500(ms)即0.5秒时间过后在执行showTime函数。如果是1000的话,即1秒过后再执行showTime函数。 所有才会出现你说的这个问题(纯个人理解^~^)。

setTimeout(callback,time); 是指,callback回调执行结束并延迟time以后,在执行setTimeout();根据js单线程的特性,可能时间比time更久;这里,可能的原因,就是callback也要一定的执行时间吧,可以用chrome的Timeline查看一下;能力不足,看代码,感觉不存在多大问题;

不管showTime是延迟1000还是500,获取时间和更新DOM都是同时执行的,所以应该不会有延迟(除非你时间计算出错了)。并且我这里测了下,也没有看到延迟。

另外,为甚不用setInterval

你先拿到这个时间的数据,然后在后一秒显示,当然会慢一秒啊。

这是精度的问题。
执行showTime()的时候,若此时系统时间秒数是10.9s,
但是now.getSeconds()=10,
如果是setTimeout('showTime()',1000),那么就始终会和系统时间差0.9s,看起来就比系统慢了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题