# JavaScript Code কিভাবে Execute হয়?

নিচের কোডটির মাধ্যমে চলুন দেখা যাক Browser এর মধ্যে Javascript কোড কিভাবে কাজ করে।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688842964053/82019424-739a-4438-8b83-e67f4e51dcae.png align="center")

যখন JS code run করা শুরু হয়, তখন Global Execution Context তৈরি হয়। এই Global Execution Context JavaScript এর Global Scope কে Represent করে। Global Execution Context সাধারণত ২ টি Phase বা ভাগে বিভক্ত থাকে।

অনেকটা এরকম,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689067549497/b75ef912-a140-4cc2-a2d3-3c564431afd8.jpeg align="center")

আর Browser এর ক্ষেত্রে এরকম,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689067629836/0ab4b2b9-0d26-411d-b09b-edb56ad81a9e.png align="center")

1. Memory Creation Phase
    
2. Code Execution Phase
    

**Memory Creation Phase:** এটি প্রত্যেক Execution Context এর প্রথম Phase যেখানে, JavaScript, Whole code line by line আকারে পড়ে। এই Phase এ JS কোন কোড Execute করে না বরং শুধু মাত্র সকল Varibale ও Function এর জন্য Memory Allocate করে। যেমন, উপরোক্ত কোডের জন্য,

লাইন ১ঃ a: undefined `// লাইন ১ এ a = 5 হলেও JS এই Phase এ Special value হিসেবে undefined কে রেখে দেয়।`

সেইম ভাবে লাইন ২ এর ক্ষেত্রেও তাই,

লাইন ২ঃ b: undefined

লাইন ৩ঃ addNumber: addNumber(num1, num2) { var ans = num1 + num2; return ans; } `// লাইন ৩ এ যেহেতু Function তাই, JS এই Phase এ Function এর Whole Body রেখে দেয়।`

লাইন ৭ ও ৮ এর ক্ষেত্রেও undefined রেখে দেয়,

লাইন ৭ঃ add1: undefined

লাইন ৮ঃ add2: undefined

অনেকটা এরকমঃ

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688847111104/b5c8f1de-9ff8-4379-94f3-c17b83f0d2ca.jpeg align="center")

যেটি Browser এর Source file এ গেলেই দেখা যায়,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688847707807/b1e0c889-bbcc-4b36-b15d-951483901cca.png align="center")

**Code Execution Phase:** এটি হলো ২য় Phase, এই Phase এই মূলত JS, Whole code line by line আকারে Execute করে। Execute করার সময়, JS এই Phase এ Variable এর মান undefined কে তার অরজিনাল value দিয়ে replace করে দেয়।

যেমন, উপরোক্ত কোডের জন্য,

লাইন ১ঃ a: 5 `// এই Phase এ JS, a এর value undefined থেকে original value হিসেবে 5 কে বসিয়ে দেয়।`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689058851450/2ea017ac-892a-4705-93ab-6ec7d7e29e2c.png align="center")

সেইম ভাবে লাইন ২ এর ক্ষেত্রেও তাই,

লাইন ২ঃ b: 10 `// এই Phase এ JS, b এর value undefined থেকে original value হিসেবে 10 কে বসিয়ে দেয়।`

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689058988636/7c04eba5-2d44-4c9b-a885-8e6859344b08.png align="center")

লাইন ৩ থেকে ৬ পর্যন্ত যেহেতু Function লেখা হয়েছে তাই Code এর control ৭ নং লাইনে চলে যায়।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689061017697/dfca9501-bb31-4d4f-b5a7-9cd8999928cd.png align="center")

লাইন ৭ঃ এখানে একটি Function Invocation হয়েছে তাই arguments হিসেবে (5, 10) সহ Code এর control ৭ থেকে Function body এর শুরুতে ৪ নং লাইনে চলে যায়। এটি যেহেতু Function তাই এর জন্য নতুন করে Execution Context তৈরি হয়

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689059649972/85533df9-c12e-4c00-b0dc-a4165067693f.png align="center")

এখানেও সেইম ভাবে এরও দুটি Phase থাকে,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688911913491/f3c34c71-9069-4606-9bed-9261d6ff87e1.jpeg align="center")

1. **Memory Creation Phase:** সেইম ভাবে এই Phase এ JS, সকল Varibale ও Function এর জন্য Memory Allocate করে। যেহেতু এই Function মধ্যে কোন Function নাই তাই, শুধু মাত্র Varibale num1, num2 ও ans এর জন্য আগের মতো initially undefined সেট করে রাখে। যেমনটা নিচের মতো
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688898593979/fc1ade0b-5079-4038-9460-98d138285c53.jpeg align="center")
    
2. **Code Execution Phase:** এই Phase থেকে JS এ Execution শুরু হয় এবং Parameter value হিসেবে num1: 5 ও num2: 10 হয়ে যায়।
    
    লাইন ৪ঃ এখানে var ans = num1 + num2; লাইনটি Execute হয়ে ans এর Value Undefined থেকে num1+num2 অর্থাৎ 5+10 = 15 হয়ে যায়।
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688899779697/6170968d-6a84-41ff-b270-9b4e770e3627.jpeg align="center")
    
    লাইন ৫ঃ এখানে return ans থাকায় উক্ত Value (15) সহ Function যেখানে invoke হয়েছিল অর্থাৎ লাইন ৭ এ add1 এর Value undefined থেকে 15 হয়ে উক্ত লাইনের কাজটি শেষ হয়ে হয়ে যাবে একই সাথে উক্ত Execution Context ও ডিলিট হয়ে যায়। এবং Code এর Control লাইন ৭ থেকে ৮ এ চলে যায়।
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689061453474/3195a493-a82d-4ba9-8fb3-512a18e2c774.jpeg align="center")
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689061543583/3ce1b540-2986-4b7f-9e20-249ac0033649.png align="center")
    

একই ভাবে লাইন ৮ এর জন্যঃ এখানে একটি Function Invocation হয়েছে তাই arguments হিসেবে (40, 50) সহ control ৮ থেকে Function এর Body এর শুরুতে ৪ নং লাইনে চলে যাবে। এটি যেহেতু Function তাই এর জন্য আবার নতুন করে Execution Context তৈরি হয়।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689065798971/a949a2c0-0970-48fc-b8cb-9fc64200bfcd.png align="center")

এবং এরও দুটি Phase থাকে

1. **Memory Creation Phase:** এই Phase এ সকল Varibale ও Function এর জন্য Memory Allocate করে। যেহেতু এখানে কোন Function নাই তাই, তাই শুধু মাত্র Varibale num1, num2 ও ans এর জন্য আগের মতো initially undefined সেট করে রাখে। যেমনটা নিচের মতো
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688900535189/39fdb47d-781e-4971-907d-53956fe68286.jpeg align="center")
    
2. **Code Execution Phase:** এই Phase থেকে Execution শুরু হয় এবং num1: 40 ও num2: 50 হয়ে যায়।
    
    লাইন ৪ঃ এখানে var ans = num1 + num2; লাইনটি Execute হয়ে ans এর Value Undefined থেকে num1+num2 অর্থাৎ 40+50 = 90 হয়ে যায়।
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688900800080/a73018ed-d78f-4070-a096-c4bab49608d1.jpeg align="center")
    
    লাইন ৫ঃ এখানে return ans থাকায় উক্ত Value (90) সহ Function যেখানে invoke হয়েছিল অর্থাৎ লাইন ৮ এ add2 এর Value undefined থেকে 90 হয়ে উক্ত লাইনের কাজটি শেষ হয়ে যাবে একই সাথে উক্ত Execution Context ও ডিলিট হয়ে যায়।
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688900899376/b6b0d3d9-d37c-4ea8-842a-3b6db6001698.jpeg align="center")
    

পরের লাইনে Execute করার মতো আর কোন কোড না থাকায় সব শেষে Global Execution Context ও ডিলিট হয়ে যায়।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688901174725/678b9007-a6f0-415f-9d1f-c9b64bbe16e4.jpeg align="center")

এভাবেই একটি JavaScript কোড behind the scene কাজ করে।

### এখন প্রশ্ন হল, JS এই Multiple Execution Context গুলো কিভাবে Track রাখে?

এটি JS তার Engine এর মাধ্যমে কাজটি করে থাকে।

Javascript Engine এর মধ্যে ২টি জিনিস থাকে।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688976499219/43b1e94f-fcd7-4f20-9986-b508cbcfc970.png align="center")

1. Memory Heap
    
2. Call Stack
    

**Memory Heap:** Code এর বিভিন্ন Memory allocation গুলো এখানে হয়।

**Call Stack:** Call stack হলো অনেকটা Data structure এর Stack এর মতো, যেখানে LIFO (Last In First Out) আকারে ডাটা গুলো Push ও Pop হয়। Call stack শুধুমাত্র Global Execution Context ও কোন Function call / invoke হলে তার জন্য যে নতুন Execution Context তৈরি হয়, সেগুলো LIFO কনসেপ্টে সাজিয়ে রেখে। এবং Execution Context সিরিয়ালি উপর থেকে Execute করতে করতে নিচের দিকে নামে। এই Call stack এর মাধ্যমেই JS বুঝতে পারে যে, বর্তমানে কোন Function running আছে।

যেমন,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688973198173/970f09de-ab39-49c9-90d0-fd96dc95d226.png align="center")

এই Code টি যখন memory তে লোড হয় তখন যে Global Execution Context তৈরি হয় সেটি Call stack এ push হয় এবং code এর control ঐ (লাইন ১) থেকে পয়েন্ট করে সামনের দিকে আগায়। যেমন,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688977156447/d2436854-0661-4c71-9708-9d4e4765a94d.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689064306149/446e012c-ca42-44fa-92c1-217b8039d543.png align="center")

এখানে, Global Execution Context push হওয়ার পর লাইন ১ থেকে code execute হওয়া শুরু করে। তার পর ২, এরপর ৩ থেকে ৬ নং লাইন পর্যন্ত Function থাকায় কোন code Execute না করে ৭ নং লাইনে চলে যায়। লাইন ৭ এ যেহেতু Function call / invoke হয়েছে তাই তার জন্য নতুন করে Execution Context তৈরি হয় এবং সেটিকে Call stack এ push করা হয়। এবং code এর control ঐ (৪) Execution Context (Function body) কে পয়েন্ট করে সামনে আগায়। যেমন,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689062301971/0153c4d2-b3cc-4201-8914-08f5dab7c664.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689064618909/eca1dbd1-1fe2-45c7-8437-5aeb00db9cea.png align="center")

এখানে নতুন Execution Context push হওয়ার পর লাইন ৪ থেকে code execute হওয়া শুরু করে। এবং উক্ত Execution Context এর সকল কোড execute করা হয়ে গেলে উক্ত Execution Context টি Call stack থেকে POP হয়ে যায় যেমন,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688978350331/f697fbff-fcc2-4a30-a6e4-070cfe6656a5.png align="center")

এবং code এর control লাইন ৭ থেকে ৮ এ চলে যায়। এবং বর্তমান অবস্থা নিচের মতো হয়ে যায়।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689062797911/5c3d9471-f03e-43dd-a565-b83410a184be.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689062872505/c53cc791-5805-489d-af60-c323d3b069b0.png align="center")

লাইন ৮ এ গিয়ে আবার একটা Fucntion call / invoke থাকায় নতুন করে Execution Context তৈরি হয় এবং সেটিকে Call stack এ push করা হয়। এবং code এর control ঐ (৪) Execution Context (Function Body) কে পয়েন্ট করে সামনে আগায়। যেমন,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689062954508/e836acef-5d46-4764-9fdc-bb473c94939d.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689064815477/2138b710-910c-4d2b-a0ee-f1ab6cca4b24.png align="center")

সেইম ভাবে, এখানে নতুন Execution Context push হওয়ার পর লাইন ৪ থেকে code execute হওয়া শুরু করে। এবং উক্ত Execution Context এর সকল কোড execute করা হয়ে গেলে উক্ত Execution Context টি Call stack থেকে POP হয়ে যায়। সেই সাথে লাইন ৮ এর Execution ও শেষ হয়।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688978814578/de68c17f-3923-48e2-a43b-47f9f60b60c5.png align="center")

এবং code এর control আবার Global Execution Context এর কাছে চলে যায়।

এভাবে লাইন ৮ এর কাজ শেষ করে পরবর্তীতে Execute করার মতো আর কোন কোড না থাকায় সব শেষে Global Execution Context ও Call stack থেকে POP হয়ে যায়। যেমন,

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688979051907/16f94493-b8f6-43ed-a4e0-7f935ac8932c.png align="center")

এবং Call Stack এ আর কিছুই অবশিষ্ট থাকে না।

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688979134695/78ecd6c1-f43e-4fc8-974f-b46c8f33c7cc.png align="center")

এভাবেই, JS Call stack এর মাধ্যমে Multiple Execution Context গুলো Track রাখে।

Hello, This is Dipta Saha. I am also learning JS. If you found any wrong information from this blog, then please let me know. I appreciate your comments, and I am open to making corrections to ensure the accuracy of the content. If you found this blog helpful, I kindly request you to like and follow me for more interesting blogs in the future. Your support motivates me to continue sharing valuable insights and knowledge about JavaScript. Thank you!
