¿Cuál es la razón por la que JavaScript setTimeout es tan inexacto?

Tengo este código por aquí:

var date = new Date();
setTimeout(function(e) {
    var currentDate = new Date();
    if(currentDate - date >= 1000) {
         console.log(currentDate, date);
         console.log(currentDate-date);
    }
    else {
       console.log("It was less than a second!");
       console.log(currentDate-date);
    }
}, 1000);

En mi computadora, siempre se ejecuta correctamente, con 1000 en la salida de la consola. Interesado en otra computadora, el mismo código, la devolución de llamada de tiempo de espera comienza en menos de un segundo y la diferencia decurrentDate - date Está entre 980 y 998.

Sé que existen bibliotecas que resuelven esta inexactitud (por ejemplo,Tock).

Básicamente, mi pregunta es:Cuales son las razones porquesetTimeout ¿No dispara en el retraso dado? ¿Podría ser la computadora demasiado lenta y el navegador intenta automáticamente adaptarse a la lentitud y dispara el evento antes?

PD: Aquí hay una captura de pantalla del código y los resultados ejecutados en la consola de Chrome JavaScript:

Respuestas a la pregunta(3)

Su respuesta a la pregunta