Javascript - TypeScript
Must Read: SOLID Design Principles Every JavaScript Developer Should Know
What is the Event Loop? How does JavaScript handle multiple lines of code, even with a single-threaded architecture?
đ§ Event Loop āĻā§?
JavaScript āĻāĻāĻāĻŋ single-threaded āĻāĻžāώāĻž āĻ āϰā§āĻĨāĻžā§ āĻāĻāĻ āϏāĻŽāϝāĻŧā§ āĻāĻāĻāĻŋ āĻāĻžāĻāĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϤāĻžāĻšāϞ⧠āĻĒā§āϰāĻļā§āύ āĻšāϞā§:
đ "āϝāĻāύ āĻā§āĻ API call āĻĻā§āϝāĻŧ, āĻŦāĻž āĻŦā§ āĻā§āύ⧠file āĻĒāĻĄāĻŧā§, āϤāĻāύ āϤ⧠āϏā§āĻ āĻāĻžāĻ āĻļā§āώ āύāĻž āĻšāĻāϝāĻŧāĻž āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰ⧠āĻā§āĻĄ āĻāĻāĻā§ āϝāĻžāĻāϝāĻŧāĻžāϰ āĻāĻĨāĻž!"
āĻāĻāĻžāύā§āĻ āĻāϏ⧠Event LoopāĨ¤ āĻāĻāĻž āĻāĻŽāύ āĻāĻāĻāĻž āĻŽā§āĻāĻžāύāĻŋāĻāĻŽ, āϝā§āĻāĻž JavaScript āĻā§ non-blocking, asynchronous, āĻāĻŦāĻ efficient āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤
đ¯ Core Concepts āĻŦā§āĻāĻž āϝāĻžāĻ:
1. Call Stack:
āĻāĻāĻžāύ⧠āϏāĻŦ synchronous (āϤāĻžāϤā§āĻā§āώāĻŖāĻŋāĻ) āĻāĻžāĻ āĻāĻā§āϰ āĻĒāϰ āĻāĻ āϝāĻžā§āĨ¤ āϝā§āĻŽāύ: console.log
, math calculation āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤
console.log('Hello');
// āĻāĻāĻŋ āϏāϰāĻžāϏāϰāĻŋ Call Stack āĻ āĻĸā§āĻā§ execute āĻšā§āĨ¤
2. Web APIs (Browser APIs):
āϝāĻāύ asynchronous āĻāĻžāĻ āϝā§āĻŽāύ setTimeout
, fetch
, event listener
āĻšāϝāĻŧ āϤāĻāύ āϏā§āĻāĻž call stack āĻĨā§āĻā§ āĻŦā§āϰ āĻšā§ā§ browser/web API āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰā§āĨ¤
setTimeout(() => {
console.log('Timer');
}, 1000);
āĻāĻāĻžāύ⧠browser āύāĻŋāĻā§ āĻāĻžāĻāĻŽāĻžāϰ āĻāĻžāϞāĻžā§, JS āĻāĻā§āĻāĻŋāύ āύāĻžāĨ¤
3. Callback Queue (or Task Queue):
āϝāĻāύ Web API āϤāĻžāϰ āĻāĻžāĻ āĻļā§āώ āĻāϰā§, āϤāĻāύ result āĻŦāĻž callback function āĻāĻ queue āϤ⧠āĻĒāĻžāĻ āĻŋā§ā§ āĻĻā§ā§āĨ¤
4. Event Loop:
āĻāĻāĻžāĻ āĻĒā§āϰ⧠orchestra-āϰ āĻāύā§āĻĄāĻžāĻā§āĻāϰāĨ¤ Event loop āĻāĻāĻāĻžāϰ āĻĒāϰ āĻāĻāĻāĻž āĻāϰ⧠āĻā§āĻ āĻāϰ⧠âCall Stack āĻĢāĻžāĻāĻāĻž āĻšā§ā§āĻā§ āĻāĻŋāύāĻž?â āϝāĻĻāĻŋ āĻĢāĻžāĻāĻāĻž āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠Callback Queue āĻĨā§āĻā§ āĻāĻāĻāĻž āĻāĻžāĻ āĻā§āύ⧠āύāĻŋāϝāĻŧā§ Call Stack āĻ āĻĸā§āĻāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧāĨ¤
đ āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ āĻāĻŦāĻžāϰ āĻĻā§āĻāĻž āϝāĻžāĻ:
console.log('Start');
setTimeout(() => {
console.log('Inside Timeout');
}, 0);
console.log('End');
⤠Execution Flow:
'Start'
â Call Stack â Console āĻ print âsetTimeout()
â Web API-āϤ⧠āĻāϞ⧠āϝāĻžāϝāĻŧ đ'End'
â Call Stack â Console āĻ print âTimer āĻļā§āώ āĻšāϞ⧠callback āϝāĻžā§ Callback Queue āϤ⧠âŗ
Event Loop āĻĻā§āĻā§ Call Stack āĻĢāĻžāĻāĻāĻž â Callback Queue āĻĨā§āĻā§ callback āύāĻŋā§ā§ Call Stack āĻ āĻĒāĻžāĻ āĻžā§
'Inside Timeout'
â Console āĻ print â
â ī¸ āϝāĻĻāĻŋāĻ
setTimeout
āĻāϰ delay0ms
, āĻāĻŋāύā§āϤ⧠āϤāĻžāĻ āϏā§āĻāĻž āĻāϏāϤ⧠āĻāĻŋāĻā§ āϏāĻŽā§ āϞāĻžāĻā§āĨ¤ āϤāĻžāĻ āϏā§āĻāĻž āϏāĻŦāĻļā§āώ⧠execute āĻšā§āĨ¤
đ§ĩ āĻā§āύ JavaScript āĻāĻā§ āĻāĻā§ āĻāĻžāĻ āĻāϰā§?
āĻāĻžāϰāĻŖ JavaScript Engine (āϝā§āĻŽāύ V8) āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻž Main Thread āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āĻāĻāĻžāϰāĻŖā§āĻ multi-tasking āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻ Event Loop āĻĻāϰāĻāĻžāϰ āĻšā§āĨ¤
đ§Ē āĻāϰāĻ āĻāĻŋāĻā§ Terms āĻāĻžāύāϞ⧠āĻāĻžāϞ⧠āĻŦā§āĻāĻž āϝāĻžāĻŦā§:
Microtask Queue
Promise
, MutationObserver
āĻāϤā§āϝāĻžāĻĻāĻŋāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž queue
Macrotask Queue
setTimeout
, setInterval
, setImmediate
āĻāϤā§āϝāĻžāĻĻāĻŋāϰ āĻāύā§āϝ
Job Queue Priority
Microtasks always execute before macrotasks
console.log("1");
setTimeout(() => {
console.log("2");
}, 0);
Promise.resolve().then(() => {
console.log("3");
});
console.log("4");
đ Output āĻšāĻŦā§:
1
4
3
2
āĻāĻžāϰāĻŖ
Promise.then()
āϝāĻžāϝāĻŧ microtask queue āϤā§, āĻāϰ āϏā§āĻāĻž priority higher than setTimeout (macrotask)āĨ¤
â
āϏāĻāĻā§āώā§āĻĒā§ āĻŽāύ⧠āϰāĻžāĻā§:
đ¸ Call Stack â āϏāϰāĻžāϏāϰāĻŋ āĻāĻžāĻ āĻāĻāĻžāύ⧠āĻāϞ⧠đ¸ Web APIs â async āĻāĻžāĻ āĻāĻāĻžāύ⧠āĻšā§ā§ callback āϤā§āϰāĻŋ āĻāϰ⧠đ¸ Callback Queue â āĻāĻžāĻ āĻĒā§āϰāϏā§āϤā§āϤ āĻšā§ā§ āĻŦāϏ⧠āĻĨāĻžāĻā§ đ¸ Event Loop â āĻĻā§āĻā§ call stack āĻĢāĻžāĻāĻāĻž āĻšāϞ⧠āĻāĻžāĻ āϏāϰāĻŋāϝāĻŧā§ āĻāύ⧠đ¸ Microtasks āĻāĻā§, āϤāĻžāϰāĻĒāϰ Macrotasks
Last updated