Helo, semua!
Hari ini, seperti yang dikatakan tajuk ?, saya akan bercakap tentang gelung acara.
Ini bukan topik yang sering ditanya oleh penemuduga secara langsung (saya hanya ingat dua kali apabila mereka meminta saya menerangkan gelung acara). TETAPI, dalam kebanyakan temu bual, mereka bertanya soalan yang berkaitan dengannya. Contohnya:
Semua soalan itu lebih mudah untuk dijawab jika anda memahami cara gelung acara berfungsi.
Sejujurnya: topik ini bukan kegemaran saya. Saya lebih suka soalan tentang kelakuan kod daripada menerangkan cara gelung acara berfungsi selama 10 minit terus.?
Jom selami! ?
## Soalan
1. Apakah gelung acara?
2. Contoh
Jawapan Ringkas:
Gelung acara bertanggungjawab untuk mengendalikan tugas tak segerak dalam masa jalan JavaScript.
Sejujurnya, saya rasa jawapan ini tidak cukup untuk memuaskan rasa ingin tahu seorang penemuduga bertanya tentang gelung acara. Jadi, dalam siaran ini, saya ingin menyelami topik ini dengan lebih mendalam.
Lebih daripada sekadar mengetahui konsep, adalah penting untuk memahami cara ia berfungsi. Itulah sebabnya saya telah menambahkan beberapa contoh pada penghujungnya.
JavaScript mempunyai masa jalan berdasarkan gelung acara, yang bertanggungjawab untuk mengendalikan tugas. Setiap bahasa mempunyai masa jalan yang unik dan perkara penting yang perlu diberi perhatian ialah JavaScript adalah benang tunggal.
Berbenang tunggal bermaksud JavaScript boleh mengendalikan hanya satu tugas pada satu masa. Inilah sebabnya mengapa gelung acara sangat penting dalam JavaScript; ia membantu mengurus tugas dengan cekap walaupun terdapat had satu utas ini.
Untuk memahami gelung acara dengan lebih baik, mari kita lihat komponen utamanya:
tindanan panggilan ialah struktur data yang menjejaki fungsi yang kami panggil. Anda boleh menganggapnya seperti timbunan plat: apabila fungsi dipanggil, ia ditambahkan pada timbunan dan apabila ia selesai, ia dialih keluar daripada timbunan.
Timbunan panggilan beroperasi pada prinsip LIFO (Last-In-First-Out), bermakna JavaScript melaksanakan fungsi mengikut susunan ia disusun—dari item paling atas ke bawah, satu di satu masa (ingat, JavaScript adalah satu benang).
Dalam masa jalan JavaScript, kami mempunyai baris gilir, yang menyimpan senarai tugasan untuk diproses. Tugasan dalam baris gilir ini menunggu sehingga timbunan panggilan kosong.
Baris Gilir Tugas (atau Baris Gilir Balik): Baris gilir ini menyimpan tugas seperti panggilan setTimeout() dan setInterval(). Tugasan di sini diproses selepas timbunan panggilan kosong dan selepas semua tugasan dalam Baris Gilir Microtask telah diproses. Lihat lebih banyak contoh tugasan yang disimpan dalam baris gilir ini di MDN.
Baris Gilir Tugasan Mikro: Baris gilir ini mempunyai keutamaan berbanding Baris Gilir Tugasan. Ia termasuk tugasan mikro seperti panggilan balik Promise dan fungsi tak segerak seperti process.nextTick() dan fungsi async.
Baris Gilir Tugas berfungsi berdasarkan FIFO (Masuk-Dulu-Keluar), bermakna tugasan diproses mengikut susunan yang ditambahkan, tetapi hanya selepas Microtask Baris gilir kosong.
gelung peristiwa ialah mekanisme yang menguruskan pelaksanaan kod tak segerak. Ia memerhati tindanan panggilan dan menyelaras antara tindanan panggilan dan baris gilir (Baris Gilir Tugas dan Gilir Mikrotugas) untuk memastikan kod berjalan lancar.
Mari kita lalui proses gelung acara langkah demi langkah. Rujuk imej di bawah untuk gambaran visual.
Dalam contoh ini:
Dengan mengikut tertib ini—Call Stack, kemudian Microtask Queue, dan akhirnya Task Queue—gelung acara membantu JavaScript mengendalikan kod tak segerak dengan cekap, walaupun dalam persekitaran satu benangnya.
Sekarang kita memahami cara gelung acara berfungsi dan cara tugasan diutamakan, mari lihat beberapa contoh.
const a = new Promise(function showA(resolve){ console.log('A'); resolve('B'); }); setTimeout(function showC() { console.log('C'); }, 0); a.then(function showB(b) { console.log(b); }); const d = function showD() { console.log('D'); }; d();
Sebelum meneruskan, cuba fikirkan tentang susunan output.
✨Apakah yang anda jangkakan?✨
Mari kita pecahkan setiap bahagian kod untuk memahami sebab kita mendapat output ini.
1. Mencipta Janji
const a = new Promise(function showA(resolve) { console.log('A'); resolve('B'); });
2. setTimeout Call
setTimeout(function showC() { console.log('C'); }, 0);
3. a.kemudian Panggil Balik
const a = new Promise(function showA(resolve){ console.log('A'); resolve('B'); }); setTimeout(function showC() { console.log('C'); }, 0); a.then(function showB(b) { console.log(b); }); const d = function showD() { console.log('D'); }; d();
4. Mentakrifkan d
const a = new Promise(function showA(resolve) { console.log('A'); resolve('B'); });
5. Memanggil d()
setTimeout(function showC() { console.log('C'); }, 0);
Pesanan Output Akhir:
a.then(function showB(b) { console.log(b); });
GIF untuk rujukan
Contoh Interaktif
const d = function showD() { console.log('D'); };
Sekali lagi, luangkan masa untuk berfikir tentang susunan output.
✨Apakah yang anda jangkakan?✨
Jom ikut penerangan...
1. Log "Mula!"
d();
A D B C
3. Azam Janji
console.log("Start!"); setTimeout(function showTimeout() { console.log("Timeout!"); }, 0); Promise.resolve("Promise!") .then(function showPromise(res) { console.log(res); }); console.log("End!");
4. Log "Tamat!"
console.log("Start!");
Pesanan Output Akhir:
setTimeout(function showTimeout() { console.log("Timeout!"); }, 0);
GIF untuk rujukan
Contoh Interaktif
Bab ini tidak terlalu panjang, tetapi saya harap contoh ini membantu anda memahami cara gelung acara berfungsi.
Saya amat mengesyorkan anda mencuba halaman interaktif untuk menganalisis contoh lain. Bermain-main di halaman itu boleh memudahkan anda memahami gelung acara dalam tindakan.
Terima kasih banyak untuk semua cinta pada catatan saya sebelum ini!
Jumpa anda minggu hadapan! ?
Selamat tinggal
Atas ialah kandungan terperinci Soalan Temuduga Teknikal - Part Event Loop. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!