Поскольку JavaScript является последовательным (не считая асинхронную способность), то почему это не «казаться» вести себя последовательным, как в этом упрощенном примере:Sequential-иш характер JavaScript с для цикла
HTML:
<input type="button" value="Run" onclick="run()"/>
JS:
var btn = document.querySelector('input');
var run = function() {
console.clear();
console.log('Running...');
var then = Date.now();
btn.setAttribute('disabled', 'disabled');
// Button doesn't actually get disabled here!!????
var result = 0.0;
for (var i = 0; i < 1000000; i++) {
result = i * Math.random();
}
/*
* This intentionally long-running worthless for-loop
* runs for 600ms on my computer (just to exaggerate this issue),
* meanwhile the button is still not disabled
* (it actually has the active state on it still
* from when I originally clicked it,
* technically allowing the user to add other instances
* of this function call to the single-threaded JavaScript stack).
*/
btn.removeAttribute('disabled');
/*
* The button is enabled now,
* but it wasn't disabled for 600ms (99.99%+) of the time!
*/
console.log((Date.now() - then) + ' Milliseconds');
};
Наконец, что будет вызывать инвалидов атрибут не вступит в силу до тех пор, после для-цикла выполнения имеет час appened? Он визуально проверяется, просто комментируя строку атрибута remove.
Следует отметить, что нет необходимости в отложенном обратном вызове, обещании или чем-либо асинхронном; однако единственная работа, которую я обнаружил, заключалась в том, чтобы окружить петлю цикла и оставшиеся строки в обратном вызове setTimeout с нулевой задержкой, который помещает его в новый стек ... но действительно ?, setTimeout для чего-то, что должно работать по существу по очереди ?
Что здесь происходит и почему не происходит setAttribute до запуска цикла for?
Браузер не делают изменения в DOM до возврата. – Barmar
Это позволяет функции делать много изменений, и вы не видите, что все они меняются постепенно. Когда он возвращается, обновленный DOM отображается за один шаг. – Barmar
@Barmar Это имеет прекрасный смысл. Спасибо. У вас есть ссылка ECMAScript или другое место для официальной ссылки и более подробная информация об этом процессе? –