【发布时间】:2011-07-05 21:19:31
【问题描述】:
我正在尝试基于 javascript 创建一个实时时钟。
重要的是它保持低内存占用,同时保持准确。
这是我的代码:
<div id="time">...</div>
<script type="text/javascript">
// I'm actually using a better name for such a global variable.
// Here I'm presuming a lookup in a global variable is faster than to a local one
var weekdays={"0":"Sun","1":"Mon","2":"Tue","3":"Wed","4":"Thur","5":"Fri","6":"Sat"};
function refTime(){
// get current time stamp
var date=new Date();
// add an hour so we get UTC+1
date.setUTCHours(date.getUTCHours()+1) // UTC+1
// store time components separately
var day=date.getUTCDay(),
hrs=date.getUTCHours(),
min=date.getUTCMinutes(),
sec=date.getUTCSeconds(),
mer=false;
// find meridiem and reduce 24h to 12h
hrs=(mer=hrs<12) ? hrs : hrs-12;
// generate the markup
document.getElementById('time').innerHTML
=weekdays[day]+'<br/>'+day+'<br/>'
+(hrs<10?'0':'')+hrs+':'+(min<10?'0':'')+min+':'
+(sec<10?'0':'')+sec+' '+(mer ? 'am' : 'pm');
} // end format is: "Tue<br/>19<br/>11:43:25 am"
setInterval(refTime,1000);
</script>
能否进一步优化?
备注:https://developer.mozilla.org/en/JavaScript/Reference/global_objects/date
【问题讨论】:
-
几个问题:首先,您可能想要使用
setInterval,而不是setTimeout,因为后者确保您的代码只被调用一次。然后,在对 setTimeout/setInterval 的调用中,您需要将refTime中的大写“T”去掉,因为原始函数称为reftime。 -
哪里有内存问题?这段代码几乎不会使用任何重要的内存。但是有几个错误:显示的时间和午夜和中午的上午/下午会出错,并且时钟只会在页面加载时更新一次。
-
嗯,是的,必须承认我是在脑海中写下它的 :)。我关心的是该函数中的所有条件/计算内容。
-
RoToRa - 我每秒分配一个新的 Date 实例。任何内存泄漏都可能很容易累积。到目前为止看起来还不错(我在最近的浏览器中看过 vmem)。但是浏览器有点不可预测。
标签: javascript optimization memory time