Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每秒刷新日期的函数最终崩溃_Javascript_Google Chrome_Datetime_Time - Fatal编程技术网

Javascript 每秒刷新日期的函数最终崩溃

Javascript 每秒刷新日期的函数最终崩溃,javascript,google-chrome,datetime,time,Javascript,Google Chrome,Datetime,Time,我有几个函数用来获取日期和时间,然后将它们推送到DOM中的元素。它似乎工作得很好,直到几分钟后脚本耗尽内存并崩溃页面。以下是我认为影响我的问题的代码: “严格使用”; ////////////////////INITIAL////////////////////////////////////////// 函数前导_0(num){ 如果(数值=12?'PM':'AM', 全职; 小时数=小时数%12; 如果(小时==0){ 小时=12; } 分钟=前导0(分钟); 秒=前导0(秒); 完整时间

我有几个函数用来获取日期和时间,然后将它们推送到DOM中的元素。它似乎工作得很好,直到几分钟后脚本耗尽内存并崩溃页面。以下是我认为影响我的问题的代码:

“严格使用”;
////////////////////INITIAL//////////////////////////////////////////
函数前导_0(num){
如果(数值<10){
num='0'+num;
}
返回num;
}
//////////////////////////DATES//////////////////////////////
函数getCurrentTime(日期){//TIME/////
var hours=date.getHours(),
分钟数=日期。getMinutes(),
秒=日期。getSeconds(),
后缀=hours>=12?'PM':'AM',
全职;
小时数=小时数%12;
如果(小时==0){
小时=12;
}
分钟=前导0(分钟);
秒=前导0(秒);
完整时间=小时+':'+分钟+':'+秒+''+后缀;
全职返回;
}//\\/////////////时间/////////
函数getYear(date){///YEAR///////
var year=date.getFullYear();
回归年;
}//\\/////////年//
函数getMonthDay(date){///月日//////
var day=date.getDate();
回归日;
}//\\///////////月日//////////
函数getMonth(date){///月////////
风险值月份=[
“一月”、“二月”、“三月”,
‘四月’、‘五月’、‘六月’,
‘七月’、‘八月’、‘九月’,
“十月”、“十一月”、“十二月”
],
月=月[date.getMonth()];
返回月份;
}//\\///////////月///
函数getWkDay(date){///周日//////
var工作日=[
‘星期日’、‘星期一’,
‘星期二’、‘星期三’,
"星期四","星期五",,
“星期六”
],
wkDay=工作日[date.getDay()];
返回工作日;
}//\\/////////周日//////////
函数callBySec(func){
设置间隔(func,1000);
}
函数pushDate(){/////推送日期/////
var today=新日期(),
工作日,
月,
白天
年,
时间
d=文件;
wkDay=getWkDay(今天);
月=getMonth(今天);
day=getMonthDay(今天);
年份=getYear(今天);
时间=getCurrentTime(今天);
d、 getElementById('wkDay')。textContent=wkDay;
d、 getElementById('month')。textContent=month;
d、 getElementById('day')。textContent=day;
d、 getElementById('year')。textContent=year;
d、 getElementById('time')。textContent=time;
callBySec(pushDate);
}//\\/////////推送日期///////
//////////////////START////////////////////////
函数start(){
pushDate();
}
start()

, 
, 
| 

尝试使用
setTimeout()
而不是
setInterval()
,因为后者创建了一个循环执行路径,而前者只是在将来的设定时间内运行代码块一次

如您所知,每秒重复执行
pushDate()

的次数都会增加一倍,请尝试使用
setTimeout()
而不是
setInterval()
,因为后者创建了一个重复执行路径,而前者只是在将来的设定时间内运行代码块一次


正如您所看到的,每秒钟您都会将
pushDate()

的重复执行次数增加一倍,我完全希望这种情况会发生,因为您使用的是递归,而且永远不会发生

问题是,你最终得到的是一个呼叫链

pushDate -> callBySec -> pushDate -> callBySec -> PushDate -> etc
无限

您应该做的是完全摆脱
callBySec
,并将启动方法更改为使用
setInterval
本身,而不是依赖递归(您当前每秒启动一个新计时器)


我完全希望这是OOM,因为您正在使用递归,并且永远不会爆发

问题是,你最终得到的是一个呼叫链

pushDate -> callBySec -> pushDate -> callBySec -> PushDate -> etc
无限

您应该做的是完全摆脱
callBySec
,并将启动方法更改为使用
setInterval
本身,而不是依赖递归(您当前每秒启动一个新计时器)

去掉这一行:

callBySec( pushDate );
pushDate()
的末尾。您已经在使用
setInterval()
每秒调用一次函数,无需再次启动计时器。结果是,您每秒创建一个计时器。一分钟后,您将每秒运行该函数60次

如果使用的是
callBySec
而不是
setInterval()
,则代码是正确的

然后
start()
函数应该调用
callBySec

“严格使用”;
函数前导_0(num){
如果(数值<10){
num='0'+num;
}
返回num;
}
函数getCurrentTime(日期){
var hours=date.getHours(),
分钟数=日期。getMinutes(),
秒=日期。getSeconds(),
后缀=hours>=12?'PM':'AM',
全职;
小时数=小时数%12;
如果(小时==0){
小时=12;
}
分钟=前导0(分钟);
秒=前导0(秒);
完整时间=小时+':'+分钟+':'+秒+''+后缀;
全职返回;
} 
功能getYear(日期){
var year=date.getFullYear();
回归年;
} 
函数getMonthDay(日期){
var day=date.getDate();
回归日;
} 
函数getMonth(日期){
风险值月份=[
“一月”、“二月”、“三月”,
‘四月’、‘五月’、‘六月’,
‘七月’、‘八月’、‘九月’,
十月、十一月