Идея неблокирования заключается в том, что итерации цикла выполняются быстро. Таким образом, для итерации для каждого тика должно потребоваться достаточно короткое время, чтобы setTimeout был точным с разумной точностью (отключено, возможно, <100 мс или около того). </p>
Теоретически ты прав. Если я напишу приложение и заблокирую галочку, setTimeouts будет отложено. Итак, чтобы ответить на ваш вопрос, кто может обеспечить выполнение setTimeouts вовремя? Вы, написав неблокирующий код, можете контролировать степень точности практически до любой разумной степени точности.
Пока javascript является «однопоточным» с точки зрения выполнения кода (исключая веб-работников и тому подобное), это всегда будет происходить. Однопоточная природа в большинстве случаев является огромным упрощением, но для успеха требуется неблокирующая идиома.
Попробуйте этот код либо в своем браузере, либо в узле, и вы увидите, что нет гарантии точности, напротив, setTimeout будет очень поздно:
var start = Date.now();
// expecting something close to 500
setTimeout(function(){ console.log(Date.now() - start); }, 500);
// fiddle with the number of iterations depending on how quick your machine is
for(var i=0; i<5000000; ++i){}
Если интерпретатор не оптимизирует цикл (чего не происходит в chrome), вы получите что-то тысячами. Снимите петлю, и вы увидите, что это 500 на носу ...