javascript中的时间敏感应用程序

javascript中的时间敏感应用程序,javascript,Javascript,我需要每1s生成一个事件。我正在测试setTimeout函数,如下所示: window.onload = function() { var oldTime = Date.now(); setTimeout(function printTime() { newTime = Date.now(); console.log(newTime - oldTime); oldTime = newT

我需要每1s生成一个事件。我正在测试setTimeout函数,如下所示:

   window.onload = function() {
        var oldTime = Date.now();

        setTimeout(function printTime() {
            newTime = Date.now();
            console.log(newTime - oldTime);
            oldTime = newTime;
            setTimeout(printTime, 1000);
        }, 1000);
    }
它返回1s,带一点位偏移:

testTimeout.js:6 1005
testTimeout.js:6 1006
2testTimeout.js:6 1001
testTimeout.js:6 1006
testTimeout.js:6 1005
testTimeout.js:6 1006
testTimeout.js:6 1005
偏移量从哪里来?是因为旧时间和新时间的计算吗

我需要每1s生成一个事件

没有办法精确地做到这一点

传递到
setTimeout
的时间是运行代码的最小保证时间,而不是确切时间

时间表示JS引擎将该函数推送到服务器的毫秒数。一旦函数进入事件队列,它将在队列中所有当前任务(如事件和其他计时器)之后运行,这将产生延迟

此外,当任何常规JS代码正在运行时,无法从事件队列执行任何任务,这也可能会造成较小的延迟

例如,此函数
测试

setTimeout(函数测试(){
console.log('second');
}, 0);
对于(i=0;i<1000000;i++);//1000000是一个任意的大数字
console.log('first')换句话说,您不能安排函数在精确的时间运行。(另外,关于0ms超时,即使在它之后没有长时间运行的循环,它在运行之前也至少需要4ms,因为浏览器将较小的延迟舍入到4ms——尽管你关于其他代码必须先完成的观点仍然成立。)