ภาษา ECMAScript/JavaScript จะยก (hoist) ตัวแปรที่ประกาศด้วย var ไปอยู่ด้านบนสุดของฟังก์ชันเสมอ เนื่องจากภาษานี้มี Function Scope ไม่มี Block Scope เหมือนภาษา C-like อื่นๆ
ตัวอย่างการ Hoisting ของ var
function() {
for(var a = 0; a < 7; a ++) {
var b = 100;
}
}
โค้ดด้านบนเทียบเท่ากับ:
function() {
var b; // ถูก hoist มาด้านบน
for(var a = 0; a < 7; a ++) {
b = 100;
}
}
ความแตกต่างกับ let และ const
แตกต่างกับ let และ const ที่มี Lexical Scoping (Block Scope) ตัวแปรจะมีขอบเขตอยู่ภายในบล็อก { ... } ที่ประกาศเท่านั้น
แนวทางปฏิบัติที่แนะนำ (Best Practice)
- ใช้
constเป็นค่าเริ่มต้น สำหรับค่าที่ไม่เปลี่ยนแปลง - ใช้
letสำหรับค่าที่ต้องเปลี่ยนแปลง - ประกาศตัวแปรในขอบเขตที่แคบที่สุด ที่จำเป็น (ภายในลูป หากใช้แค่ในลูป)
- หลีกเลี่ยง
varในโค้ดสมัยใหม่
// ✅ แนะนำ: ใช้ const/let ในบล็อกลูป
for (let i = 0; i < 10; i++) {
const item = items[i];
// item และ i มีขอบเขตอยู่ในลูปเท่านั้น
}
// ❌ ไม่แนะนำ: ใช้ var (function-scoped, hoisting)
for (var i = 0; i < 10; i++) {
var item = items[i];
// item และ i "ลीक" ออกมานอกลูป
}