论坛首页 Web前端技术论坛

JavaScript写的一段代码特占内存

浏览 8574 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-29   最后修改:2010-01-29

大家都运行下,下面的javascript脚本运行的时候特占内存,提提建议?

time.js如下:

var montharray = new Array("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12")
document.write("<span id=clock></span>");
function getthedate(){
    var date = new Date();
 
 var year = date.getYear()
    if (year < 1000)
        year += 1900
 var month=date.getMonth();
 var day=date.getDate();
 var hours=date.getHours();
 var minutes=date.getMinutes();
  var second = date.getSeconds();
 
 var timevalue="&nbsp;"+year+"年";
 
 timevalue+=montharray[month]+"月";
 timevalue+=((day<10)?("0"+day):day)+"日&nbsp;&nbsp;";
 
 timevalue+=(hours<13)?("上午&nbsp;"+hours):("下午&nbsp;"+(hours-12))+"时";
 
 timevalue+=((minutes<10)?("0"+minutes):minutes)+"分";
 timevalue+=((second<10)?("0"+second):second)+"秒";


    document.getElementById("clock").innerHTML = timevalue;
    window.setInterval("getthedate()", 1000);
}

getthedate();

 

 

html如下:

  <body>
  <script src="time.js"></script>
   </body>

   发表时间:2010-01-30  
window.setInterval("getthedate()", 1000);
惹的祸,getthedate函数里请使用window.setTimeout("getthedate()",1000);

0 请登录后投票
   发表时间:2010-01-31  
对,就是这么回事!
0 请登录后投票
   发表时间:2010-01-31  
setTimeout()在执行时,是在载入后延迟指定时间后,去执行一次表达式,记住,次数是一次
而setInterval()则不一样,它从载入后,每隔指定的时间就执行一次表达式
0 请登录后投票
   发表时间:2010-01-31  
楼上说的都对,但是都没有仔细看楼主代码背后的需求

“一个简单的例子,在网页上某个位置显示当前时间,并且每秒更新”

从需求看,用setInterval是没有问题的。

楼主你的问题在于window.setInterval("getthedate()", 1000);这个语句的调用位置。用setInterval没错,但是不应该放到getthedate函数里面,而是应该放到onload函数或者某个按钮的onclick中都可以。

现在你的程序会导致,每一秒之后,客户端中就多了一个新的timer,因为你的setInterval就在定时函数中声明,这个有点像无限递归的意思。

把setInterval只需定义一次。把你最后的getthedate()替换为window.setInterval("getthedate()", 1000);
同时删除getthedate方法内部的setInterval


2 请登录后投票
   发表时间:2010-01-31  
setInterval(function(){
  //你的代码....
},1000)
0 请登录后投票
   发表时间:2010-02-01   最后修改:2010-02-01
bluemeteor 写道
楼上说的都对,但是都没有仔细看楼主代码背后的需求

“一个简单的例子,在网页上某个位置显示当前时间,并且每秒更新”

从需求看,用setInterval是没有问题的。

楼主你的问题在于window.setInterval("getthedate()", 1000);这个语句的调用位置。用setInterval没错,但是不应该放到getthedate函数里面,而是应该放到onload函数或者某个按钮的onclick中都可以。

现在你的程序会导致,每一秒之后,客户端中就多了一个新的timer,因为你的setInterval就在定时函数中声明,这个有点像无限递归的意思。

把setInterval只需定义一次。把你最后的getthedate()替换为window.setInterval("getthedate()", 1000);
同时删除getthedate方法内部的setInterval




对的,你得分清用setTimeout和setIntervale的区别

现在的setIntervale的位置换成setTimeout就对了

还有的是, 你用+=对字符串操作也很多, 建议使用array.join来一次性拼装
0 请登录后投票
   发表时间:2010-02-01  
上面两种修改方法都对。
1,将setInterval() 替换成 settimeout();
或者
2,将setInterval() 的执行从function中拿出来;也可以。

楼主现在的代码会无穷次的增加 function 的执行次数。
0 请登录后投票
   发表时间:2010-02-01  
setTimeout()是到某一个时刻开始执行,只执行一次
而setInterval()是每隔一个时间段执行一次,执行多次,相当于定时器
0 请登录后投票
   发表时间:2010-02-01  
正解已经出现
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics