请看如下两段代码:
代码段1:function test(){
JavaScript code goes heresetTimeout(test,1000);
}
test();代码段2:function test(){
JavaScript code goes here
}
setInterval(test,1000);
上面两段代码执行起来在执行效率上、内存占用上、性能上或者其它的方面,
有什么区别吗?
使用哪一种更好一些呢?为什么?
希望能解开我心中的疑问。
谢谢!!!

解决方案 »

  1.   

    转的:
    ====================================================================================
    setTimeout方法是定时程序,也就是在什么时间以后干什么。干完了就拉倒。 
    setInterval方法则是表示间隔一定时间反复执行某操作。 
    如果用setTimeout实现setInerval的功能,就需要在执行的程序中再定时调用自己才行。如果要清除计数器需要 根据使用的方法不同,调用不同的清除方法: 
    例如: 
    tttt=setTimeout('northsnow()',1000); 
    clearTimeout(tttt); 
    或者: 
    tttt=setInterval('northsnow()',1000); 
    clearInteval(tttt); 
      

  2.   

    setInterval效率好
    setTimeout好控制
      

  3.   

    我觉得用 setInterval 比较好,因为递归消耗内存比较多。
      

  4.   

    setTimeout和setIntelval都有定时的功能!!!取消定时功能的时候,都有对应的clearTimeout以及clearInterval与之对应。但是他们之间是有区别的!setTimeout指的是:间隔一段时间后执行,只执行一次setInterval是指:每隔一段时间执行,执行多次<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    </HEAD><BODY>
    <div id="time"></div>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var timeid;
    function setTime(){
       var date=new Date();
       var h=date.getHours();
       var m=date.getMinutes();
       var s=date.getSeconds();
       document.getElementById("time").innerHTML=h+":"+m+":"+s;
    }
    timeid=setInterval("setTime()",1000);//他的调用在外部调用,而不是递归调用,表示每隔1s调用一次
    function stop(){
       clearInterval(timeid);
    }
    //-->
    </SCRIPT>
    <input type="button" value="暂停" onclick="stop()">
    <input type="button" value="开始" onclick="timeid=setInterval('setTime()',1000);">
    </BODY>
    </HTML>setTimeout<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    </HEAD><BODY>
    <div id="time"></div>
    <SCRIPT LANGUAGE="JavaScript">
    <!--
    var timeid;
    function setTime(){
       var date=new Date();
       var h=date.getHours();
       var m=date.getMinutes();
       var s=date.getSeconds();
       document.getElementById("time").innerHTML=h+":"+m+":"+s;
       timeid=setTimeout("setTime()",1000);//递归调用,表示1s后执行一次
    }
    setTime();//页面加载后开始执行
    function stop(){
       clearTimeout(timeid);
    }
    //-->
    </SCRIPT>
    <input type="button" value="暂停" onclick="stop()">
    <input type="button" value="开始" onclick="timeid=setInterval('setTime()',1000);">
    </BODY>
    </HTML>
      

  5.   

    能再说的详细一点吗?太简短了,我有点笨,不太明白。
    举个小例子说明一下setTimeout好控制在哪里啊?
      

  6.   

    个人觉得setTimeout
    因为SetInterval不停的调用消耗内存<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>无标题页</title>
      <script type="text/javascript">
        window.onload=function()
        {
          setTimeout("document.getElementById('aa').innerHTML=new Date().getSeconds();",1000);
          setInterval("document.getElementById('bb').innerHTML=new Date().getSeconds();",1000);
        }
      </script>
    </head>
    <body>
    <div id="aa"></div>
    <div id="bb"></div>
    </body>
    </html>
      

  7.   

    setTimeout (表达式,延时时间)  
    setInterval(表达式,交互时间)
    setTimeout   在执行时,是在载入后延迟指定时间后,去执行一次表达式,仅执行一次
    setInterval 在执行时,它从载入后,每隔指定的时间就执行一次表达式
      

  8.   

    setInterval有风险。
    推荐setTimeout吧。不是有篇很出名的有关定时器的文章吗?jquery作者John Resig写的。
    http://www.phpweblog.net/rainman/archive/2009/01/05/6267.html
      

  9.   

    setTimeout 执行一次
    setInterval 执行无限次。。用了setTimeout,之所以无限次执行,原因在于在调用的函数里又调用了setTimeout启动的地方
    setTimeout(cal 1000);调用的方法
    function cal() {   //以上为要执行的代码   // 最后递归下
       setTimeout(cal, 1000);
    }
      

  10.   

    看来各位都没有认真看我的内容啊!!!
    setTimeout 执行一次
    setInterval 执行无限次。。
    这点我是知道的。
      

  11.   

    你觉得每次调用一遍效率高???
    另外,文档看过没,你怎么样才能clearTimeout,还有clearInterval???
    不就是通过setTimeout和setInterval返回的随机数字?那么每次都生成一遍你觉得怎么样??
      

  12.   

    请看如下代码:function test(){alert("Hello!!!");}
    setInterval("test()",3000);等待20多秒后再单击确定,只有一个弹出框啊!
    并不像文档中所说的那样(会一起弹出好几个弹出框)
    而且下一个弹出框还是在3秒后弹出。
    我的测试环境是ie6,这是为什么?
      

  13.   

    JavaScript引擎是单线程的,强制所有的异步事件排队等待执行
    setTimeout 和 setInterval 在执行异步代码的时候有着根本的不同
    如果一个计时器被阻塞而不能立即执行,它将延迟执行直到下一次可能执行的时间点才被执行(比期望的时间间隔要长些)
    如果setInterval回调函数的执行时间将足够长(比指定的时间间隔长),它们将连续执行并且彼此之间没有时间间隔。
    --------------------------------------还有一点重要的区别setTimeout递归执行的代码必须是上一次执行完了并间格一定时间才再次执行
    比仿说: setTimeout延迟时间为1秒执行, 要执行的代码需要2秒来执行,那这段代码上一次与下一次的执行时间为3秒. 而不是我们想象的每1秒执行一次.setInterval是排队执行的
    比仿说: setInterval每次执行时间为1秒,而执行的代码需要2秒执行, 那它还是每次去执行这段代码, 上次还没执行完的代码会排队, 上一次执行完下一次的就立即执行, 这样实际执行的间隔时间为2秒这样的话在我看来, 如果setInterval执行的代码时间长度比每次执行的间隔段的话,就没有意义,并且队伍越来越长,内存就被吃光了.如果某一次执行被卡住了,那程序就会被堵死而setTimout以下写法不会出现因为一次被堵住,而内存被吃光的问题. 但是执行的时间隔是不准确和确定的
    function test(){
    JavaScript code goes heresetTimeout(test,1000);
    }
    test();如时写成以下这样,会出现什么情况,我还没想明白,如果按js单线程的解释其结果应该和setInterval一样了.
    function test(){
    setTimeout(test,1000);
    JavaScript code goes here
    }
    test();
      

  14.   


    这两种写法应该只是第一次调用有所不同吧,前一种第一次执行“JavaScript code goes here”这部分是没有延时的。后面一种和setInterval是不一样的,和第一种类似
      

  15.   

    setInterval会因为callback的执行时间过长而导致callback之间的间隔时间有所缩短
    setTimeout不会有类似问题。
      

  16.   

    从语法来看
    setTimeout 就是表示指定多少时间后 执行一个方法
    至于setTimeout中执行的函数在继续setTimeout调用本身 这个应该属于技巧 不属于setTimeout本身的含义
    这样就明显区别于setInterval从效果上可以看出 setInterval 中调用的方法基本属于原子型的 他不需要理会自己下次被调用会怎么样
    而setTimeout中再递归调用方法(递归是顺着大家的话来说,其实我不觉得方法中再setTimeout属于递归) 则方法每次的递归调用应该是有关联的(没任何关联的话 为什么不直接setInterval?)由上得出效率不知道 
    但setInterval应该适合定时任务,每次任务之间不需要关联
    setTimeout的递归调用应该是属于连续的事务操作最终setTimeout可以模拟setInterval 反过来则不行
      

  17.   

    看来使用setTimeout比setInterval要好啊!!!
      

  18.   

    setInterval比递归setTimeout好!
    老外写的那篇说setInterval不好的文章值得商榷,根据我的实测,不存在老外说的那个问题。自测方法:
    页面写100000+个setTimeout递归,运行半个小时之后,看资源消耗;
    页面写100000+个setInterval,运行半个小时之后,看资源消耗;