Dark mode
การทำงานของ JavaScript
JavaScript ในเว็บเบราว์เซอร์
- การโหลดและประมวลผล: เมื่อเบราว์เซอร์โหลดหน้าเว็บ HTML จะถูกอ่านและประมวลผลก่อน จากนั้นไฟล์ JavaScript ที่อ้างอิงใน
<script>
จะถูกโหลด - การแยกวิเคราะห์: JavaScript engine จะอ่านและวิเคราะห์โค้ด JavaScript เพื่อสร้าง Abstract Syntax Tree (AST) ซึ่งเป็นโครงสร้างต้นไม้ที่แสดงความสัมพันธ์ของโค้ด
- การคอมไพล์: JavaScript engine แปลง AST เป็นรหัสเครื่องหรือรหัสขั้นกลางที่ทำงานได้เร็วขึ้น
- การประมวลผล: โค้ดที่คอมไพล์แล้วจะถูกประมวลผลโดย JavaScript engine ทำให้หน้าเว็บมีการโต้ตอบได้
JavaScript Engines
JavaScript engines คือโปรแกรมที่แปลและประมวลผลโค้ด JavaScript ตัวอย่างเช่น:
- V8: พัฒนาโดย Google ใช้ใน Chrome และ Node.js มีประสิทธิภาพสูงและเป็นที่นิยมมากที่สุด
- SpiderMonkey: พัฒนาโดย Mozilla ใช้ใน Firefox เป็น JavaScript engine ตัวแรกที่เคยสร้างขึ้น
- JavaScriptCore: พัฒนาโดย Apple ใช้ใน Safari ปรับให้เหมาะกับอุปกรณ์ Apple
- Chakra: พัฒนาโดย Microsoft ใช้ใน Edge รุ่นเก่า (ปัจจุบัน Edge ใช้ V8)
Event Loop
JavaScript เป็นภาษาแบบ single-threaded (ประมวลผลทีละคำสั่ง) แต่สามารถจัดการงานแบบ asynchronous (ไม่ต้องรอกัน) ได้อย่างมีประสิทธิภาพผ่านกลไกที่เรียกว่า Event Loop:
Call Stack: คือพื้นที่หน่วยความจำที่เก็บลำดับการทำงานของฟังก์ชัน
- ทำงานตามหลัก LIFO (Last In, First Out) - ฟังก์ชันที่เข้ามาทีหลังจะถูกประมวลผลก่อน
- เมื่อเรียกฟังก์ชัน จะถูกเพิ่มเข้าไปบน Stack
- เมื่อฟังก์ชันทำงานเสร็จ จะถูกนำออกจาก Stack
Callback Queue: คือแถวคอยที่เก็บงานที่ต้องทำในอนาคต
- เก็บ callbacks จากการทำงานแบบ asynchronous เช่น setTimeout, fetch, event listeners
- งานเหล่านี้จะถูกจัดเรียงตามลำดับเวลาที่ควรทำงาน (FIFO - First In, First Out)
Event Loop: เป็นกลไกหลักที่ทำให้ JavaScript ทำงานแบบ non-blocking
- ทำหน้าที่ตรวจสอบ Call Stack และ Callback Queue อย่างต่อเนื่อง
- หากพบว่า Call Stack ว่าง (ไม่มีฟังก์ชันกำลังทำงาน) จะดึงงานจาก Callback Queue มาใส่ใน Call Stack
- กระบวนการนี้ทำให้ JavaScript สามารถรันโค้ดหลักไปได้เรื่อยๆ โดยไม่ต้องรอการทำงานที่ใช้เวลานาน
เปรียบเสมือนพนักงานคนเดียว (single-thread) ที่ทำงานหลายอย่างได้โดยไม่ต้องรอ โดยเมื่อมีงานที่ต้องใช้เวลา จะส่งให้คนอื่นช่วยทำ แล้วกลับมาทำงานอื่นต่อ เมื่องานนั้นเสร็จแล้วจึงค่อยกลับไปจัดการผลลัพธ์
ตัวอย่างการทำงานของ Event Loop:
js
console.log("Start"); // 1. ทำงานทันที
setTimeout(function() {
console.log("Wait 2 seconds"); // 3. ทำงานหลังจาก 2 วินาที
}, 2000);
console.log("End"); // 2. ทำงานทันทีหลังจากบรรทัดแรก