ในการเขียน JavaScript สมัยใหม่ ความแตกต่างระหว่าง `var`, `let`, และ `const` ในแง่ของ Scope และ Hoisting มีผลอย่างไรต่อพฤติกรรมโปรแกรม?
กvar และ let มี Block Scope เหมือนกัน ต่างกันที่ var Hoist ค่าเริ่มต้นเป็น 0 ไม่ใช่ undefined
ขvar มี Function Scope และถูก Hoist พร้อม undefined, let/const มี Block Scope และถูก Hoist แต่อยู่ใน Temporal Dead Zone จนกว่าจะถึงบรรทัดประกาศ
คvar, let, const มี Scope เหมือนกันทุกอย่าง ต่างกันแค่ const ไม่สามารถเปลี่ยนค่าได้
งlet มี Global Scope, var มี Block Scope และ const ไม่ถูก Hoist เลย
เฉลยอธิบาย
var มี Function Scope (หรือ Global Scope) และ Hoisting ทำให้ตัวแปรถูกยกขึ้นบนสุดของ Function พร้อมค่า undefined ทำให้เกิด Bug ที่ไม่คาดคิดได้ ส่วน let และ const มี Block Scope ({}) และถูก Hoist เช่นกันแต่อยู่ใน Temporal Dead Zone (TDZ) คือไม่สามารถใช้งานได้ก่อนบรรทัดประกาศ จะเกิด ReferenceError ตัวเลือก A ผิดเพราะ Scope ต่างกัน, C ผิดทั้งหมด และ D ผิดเพราะ var มี Function Scope ไม่ใช่ Block Scope และ Hoist เป็น undefined ไม่ใช่ 0