Middle
Opowiedz o szczególnym przypadku użycia funkcji setTimeout z zerowym czasem opóźnienia.
sobes.tech AI
Odpowiedź od AI
setTimeout(callback, 0) umieszcza callback w kolejce makro-zadań (kolejka makro-zadań). Kod wewnątrz callback zostanie wykonany po tym, jak bieżący stos wywołań będzie pusty i zostanie przetoczony następny cykl pętli zdarzeń makro-zadań.
Główne scenariusze użycia:
- Opóźnione wykonanie po renderowaniu: Pozwala wykonać kod po tym, jak przeglądarka przetworzy bieżące zmiany w DOM.
// Zmiana elementu DOM element.textContent = 'Nowy tekst'; // Opóźnione działanie zależne od zaktualizowanego DOM setTimeout(() => { console.log('DOM zaktualizowany, można pracować z nowym stanem'); }, 0); - Podział długich operacji: Pomaga zapobiec blokowaniu głównego wątku, dzieląc długie obliczenia na mniejsze części, wykonywane w mikro-zadaniach (makro-zadaniach).
function processLargeData(data) { let i = 0; function processChunk() { const chunkSize = 1000; const end = Math.min(i + chunkSize, data.length); // Przetwarzanie części danych for (let j = i; j < end; j++) { // Robienie czegoś z data[j] } i = end; if (i < data.length) { // Odłożyć kolejną część setTimeout(processChunk, 0); } else { console.log('Przetwarzanie zakończone'); } } processChunk(); } - Przekazanie wykonania po głównym skrypcie: Gwarantuje, że określony kod zostanie wykonany po pełnej inicjalizacji bieżącego skryptu i przetworzeniu wszystkich operacji synchronicznych.
console.log('Początek skryptu'); setTimeout(() => { console.log('Wykonuje po głównym skrypcie'); }, 0); console.log('Koniec skryptu'); // Wynik: // Początek skryptu // Koniec skryptu // Wykonuje po głównym skrypcie
Ważne jest, aby pamiętać, że opóźnienie zerowe nie oznacza natychmiastowego wykonania. Czas wykonania zależy od obciążenia pętli zdarzeń i innych zadań w kolejkach (zwłaszcza mikro-zadań przed makro-zadaniami).