javascript中的setTimeout函数太慢

javascript中的setTimeout函数太慢,javascript,settimeout,stopwatch,Javascript,Settimeout,Stopwatch,所以我用JavaScript和HTML为一个项目创建了一个秒表,它只是一个普通的秒表,对于start_timer()函数,我使用setTimeout()函数来确定速度。 但当我在浏览器中运行文件时,它们似乎计数太慢,因为秒数不同步。 这里的视频演示了时钟有多慢: 我觉得这是一个非常愚蠢的问题,但我非常感谢你的帮助;)我想知道我是否需要使用web worker之类的工具(这是我第一个完整的javascript项目,所以我对一些东西还不熟悉) 代码如下 var isTiming=false//如设

所以我用JavaScript和HTML为一个项目创建了一个秒表,它只是一个普通的秒表,对于start_timer()函数,我使用setTimeout()函数来确定速度。 但当我在浏览器中运行文件时,它们似乎计数太慢,因为秒数不同步。 这里的视频演示了时钟有多慢:

我觉得这是一个非常愚蠢的问题,但我非常感谢你的帮助;)我想知道我是否需要使用web worker之类的工具(这是我第一个完整的javascript项目,所以我对一些东西还不熟悉) 代码如下

var isTiming=false//如设计中所述,这是为了确定秒表是否正在计数
无功转速=10//10毫秒计数允许百分之一毫秒,以获得更好的精度
var binaryTrue=0//检查秒表是否暂停
函数start_stopwatch(){//函数开始计数
if(isTiming==true){
var stopwatch=document.getElementById(“时间表”).innerHTML;//将秒表设置为HTML中的数字时钟
//使用数组以hh:mm:ss:lll格式显示经过的时间
//每个按时间顺序排列的位置值在数组中从左到右的不同位置(数值)
var arr=秒表拆分(“:”);
/*每次出现“:”时,通过分隔每个值(秒、分钟等)来拆分数组
当按下按钮时*/
var hr=arr[0];//第一个位置:hr:在数组的第一个空间
var min=arr[1];//第二个位置:数组第二个空间的mm
var sec=arr[2];//第三个位置:数组第三个空格处的ss
var millisec=arr[3];//第四个位置:数组第四个空间的lll
//以正常数字时钟格式计算,每10毫秒执行一次,允许百分之一秒
//在10毫秒后返回下一个值
毫秒++;
如果(毫秒<10){
毫秒=“0”+毫秒;
}
如果(毫秒/100==1){
毫秒=0;
毫秒=“0”+毫秒;
如果(第59节===1){
秒=0;
sec=“0”+sec;//在显示为“0”而不是“00”的位置值之后添加
如果(最小值/59==1){
hr++;
最小值=0;
min=“0”+min;//在显示为“0”而不是“00”的位置值之后添加
秒=0;
sec=“0”+sec;//在显示为“0”而不是“00”的位置值之后添加
}否则{
min++;
如果(最小值<10){
最小值=“0”+最小值;
}
}
}否则{
sec++;
如果(第10节){
如果(秒<1){
秒=“0”+“0”+秒;
}//在显示为“0”而不是“00”后添加//
否则{
秒=“0”+秒;
}
}否则{
如果(秒<1){
秒=“0”+秒;
}
}
}
}
//更新HTML数字时间
document.getElementById(“时间表”).innerHTML=hr+:“+min+”:“+sec+”:“+millisec;//将数组修改为更新的时间
setTimeout(启动秒表,(速度/**(6/7)/1.072)*/);//这往往是不同步的,因为它比正常时钟慢。因此*((6/7)/1.072)可以提高速度。
document.getElementById(“控件”).innerHTML=“暂停”;
}
}
//函数允许用户根据需要更改计数速度,并根据需要更改次数
//
功能更改速度(){
speedInput=window.prompt(“输入速度,其中'1'=1秒或'2'计数快一倍,或'0.5'计数慢一倍”);
//输入验证/验证,因为用户只应输入实际数字,无论是浮点数还是整数。
//isNaN在这里是一个有用的函数,其中NaN表示“不是数字”
if(isNaN(speedInput)){//如果用户输入的速度值实际上(仅)不是一个数字
speedInput=window.prompt(“输入速度作为一个数字,其中'1'=1秒或'2'计数快一倍,或'0.5'计数慢一倍。仅限数字”);
}
speedLength=speedInput.length;//输入验证形式的防御性设计-最小长度
speedInputHolder=speedInput;
speedInput=1/speedInputHolder;//将用户请求的速度转换为计数长度(例如,2x速度=0.5秒长度,速度快2倍,因此可访问用户界面)
如果(speedInput==null){//“取消”按钮按下
速度=速度;
}否则{
如果(speedLength>0){
speedInput毫秒=(speedInput*10);//不*1000,因为还包括10秒
速度=(SpeedInputMillistics/**((60/7)/1.072)*/);//需要确保4.275方法仍然同步*/
}
}
如果(speedInputHolder==1){
var indicatedSpeed=document.getElementById(“speedIndicator”).innerHTML=“计数速度:”+”(“+(1/speedInput)+“x速度”+”);
var indicateInterval=document.getElementById(“分馏指针”).innerHTML=“计数频率:“+speedInput+”秒。”
}否则{
var indicatedSpeed=document.getElementById(“speedIndicator”).innerHTML=“计数速度:”+”(“+(1/speedInput)+“x速度”+”);
var indicateInterval=document.getElementById(“分馏指针”).innerHTML=“计数频率:“+speedInput+”秒。”
}
}
函数change_state(){//函数从开始更改为暂停或从暂停更改为开始
if(isTiming==false){
isTiming=true;
binaryTrue=1;
启动秒表();
var start=document.getElementById(“控件”).innerHTML=“暂停”;
log(“计时器启动”);
}否则{
秒表;
日志(“计时器停止”);
}
}
函数重置(){
如果(binaryTrue==1){
var reset=document.getElementById(“时间表”).innerHTML=“00”+”:“+”00“+”:“+”00“+”:“+”00”;
if(isTiming==false){
var Start=document.getElementById(“控件”).innerHTML=“开始”;
}