Javascript设置超时不';不允许间隔低于100毫秒

Javascript设置超时不';不允许间隔低于100毫秒,javascript,timer,Javascript,Timer,我想每10毫秒启动一个递归函数,但setTimeout似乎不会接受任何小于100的值,无论我输入什么 decrementCountdown = function() { console.log('fired'); t = setTimeout("decrementCountdown()", 100); } 为什么我不能将值设置为1000毫秒以下 EDIT:我的计时器似乎启动正常……问题是当我使用它调用函数时(如Jquery的html())。即使setTimeout以正确的时间间

我想每10毫秒启动一个递归函数,但setTimeout似乎不会接受任何小于100的值,无论我输入什么

decrementCountdown = function() {
    console.log('fired');
    t = setTimeout("decrementCountdown()", 100);
}
为什么我不能将值设置为1000毫秒以下

EDIT:我的计时器似乎启动正常……问题是当我使用它调用函数时(如Jquery的html())。即使setTimeout以正确的时间间隔调用函数,它的启动速度也不会超过100毫秒

有人知道我如何在我的页面上制作一个倒计时计时器,它可以倒计时10毫秒吗?

一个更好的例子是:

var stop = 0;
decrementCountdown = function() {
    console.log(new Date().getTime());
    stop++;
    if (stop<10) t = setTimeout("decrementCountdown()", 100);
}

decrementCountdown();
var-stop=0;
递减计数=函数(){
log(newdate().getTime());
stop++;
if(stop这里有一个函数,它会准确地告诉您系统浏览器中的
setTimeout()
的变化。它运行10000次
setTimeout(fn,1)
操作,记录调用之间的平均、最大和最小延迟,并将其输出到屏幕

setTimeout()
确实有一个它将遵循的最小值。它因浏览器而异,但通常在10-20ms的范围内(虽然它可以更小或更大,取决于浏览器)。这称为“夹紧”。它的目的是保护浏览器事件队列不受太多javascript执行和没有足够时间做其他事情(如服务其他用户事件、重新绘制等)的影响

但是,这只意味着浏览器不会比最小值更早启动一个,并不意味着你总是能那么快地得到一个。Javascript是单线程的,所以如果浏览器忙,
setTimeout()
在不再执行javascript并且下一个计时器事件到达队列前端之前不会发生

此外,在一些现代浏览器中,当带有计时器的页面不是当前选项卡时,计时器会变慢。在上面的页面中,您可以通过在运行时切换到另一个选项卡来看到这一点,并且可以看到您的平均时间变慢了

对于那些好奇的人,以下是该页面的代码:

var lastTime = new Date();
var cumDiff = 0;
var minDelta = 1000000;
var maxDelta = 0;
var cnt = 0;
var nowElem = document.getElementById("now");
var deltaElem = document.getElementById("delta");
var minDeltaElem = document.getElementById("minDelta");
var maxDeltaElem = document.getElementById("maxDelta");
function run() {
    var now = new Date().getTime();
    var diff = now - lastTime;
    cumDiff += diff;
    minDelta = Math.min(diff, minDelta);
    maxDelta = Math.max(diff, maxDelta);
    cnt++;
    var avgDelta = cumDiff / cnt;
    lastTime = now;
    nowElem.innerHTML = now;
    deltaElem.innerHTML = avgDelta.toFixed(1);
    minDeltaElem.innerHTML = minDelta;
    maxDeltaElem.innerHTML = maxDelta;
    if (cnt < 10000) {
        setTimeout(run, 1);
    }
}
setTimeout(run, 1);
var lastTime=新日期();
var-cumDiff=0;
var minDelta=1000000;
var maxDelta=0;
var-cnt=0;
var nowElem=document.getElementById(“现在”);
var deltaElem=document.getElementById(“增量”);
var minDeltaElem=document.getElementById(“minDelta”);
var maxDeltaElem=document.getElementById(“maxDelta”);
函数运行(){
var now=new Date().getTime();
var diff=现在-上次;
cumDiff+=diff;
minDelta=Math.min(差异,minDelta);
maxDelta=数学最大值(差异,maxDelta);
cnt++;
var avgDelta=cumDiff/cnt;
上次=现在;
nowElem.innerHTML=now;
deltaElem.innerHTML=avgDelta.toFixed(1);
minDeltaElem.innerHTML=minDelta;
maxDeltaElem.innerHTML=maxDelta;
如果(cnt<10000){
setTimeout(运行,1);
}
}
setTimeout(运行,1);

免责声明:一些较旧的浏览器没有非常精确的
Date()
函数(仅精确到10-20ms内),因此这些数据在其中一个较旧的浏览器中不会非常精确。

我尝试了您的示例,它似乎工作得很好

值得一提的是,我使用

function decrementCountdown()
{
    /*Do your thing*/
}
setInterval(decrementCountdown, 100);

什么让你认为它不存在?你的例子并不能证明任何事情。因为无论我放999还是1,它都会以完全相同的速率发射…1秒。这是一个简化的例子,我的真实代码使用这个函数来减少倒计时。如果我包含它会更有帮助吗?