ตอนที่ 3: ตัวแปร (Variables) กล่องเก็บข้อมูลในโลก JS

1. 🎯 ตอนที่ 3: ตัวแปร (Variables) กล่องเก็บข้อมูลในโลก JS
สวัสดีครับน้องๆ นักพัฒนาทุกคน! ชงกาแฟกันมาให้พร้อม เพราะวันนี้พี่จะพาดำดิ่งลงสู่แก่นรากฐานของการเขียนโปรแกรม นั่นคือเรื่องของ “ตัวแปร” (Variables)
ในการเขียนโปรแกรม ตัวแปรเปรียบเสมือน “กล่อง” ที่เราเอาไว้เก็บข้อมูลต่างๆ ไม่ว่าจะเป็นชื่อผู้ใช้ อายุ หรือตะกร้าสินค้า เพื่อให้เราสามารถหยิบข้อมูลเหล่านั้นมาใช้งานและเปลี่ยนแปลงได้ในภายหลัง แต่รู้ไหมครับว่าในโลกของ JavaScript กล่องเก็บของเหล่านี้เคยสร้างฝันร้ายให้กับโปรแกรมเมอร์มานักต่อนักแล้ว! มาดูกันว่าเกิดอะไรขึ้น และโลกยุคใหม่แก้ไขปัญหานี้อย่างไร
2. 📖 เปิดฉาก (The Hook)
น้องๆ ลองจินตนาการดูว่า เรามีกล่องเก็บของชื่อ “รหัสผ่าน” อยู่ในห้องส่วนตัว (เสมือนเป็น Scope ในโค้ด) วันดีคืนดี มีใครก็ไม่รู้จากนอกห้องสามารถมองเห็นและดึงรหัสผ่านนี้ไปใช้ได้หน้าตาเฉย! หรือหนักกว่านั้น เรายังไม่ได้สร้างกล่องขึ้นมาเลย แต่ระบบดันเสกกล่องเปล่าๆ มาให้เราใช้ซะงั้น อาการ “กล่องทะลุมิติ” หรือ “กล่องเกิดก่อนกำหนด” แบบนี้แหละครับ คือความน่าปวดหัวของ JavaScript ยุคเก่าที่ใช้คีย์เวิร์ด var
จนกระทั่งในปี 2015 เมื่อมาตรฐาน ES6 ถือกำเนิดขึ้น JavaScript ก็ได้รับการอัปเกรดครั้งใหญ่ โดยการเพิ่มคีย์เวิร์ดอย่าง let และ const เข้ามาเป็นอัศวินขี่ม้าขาว เพื่อจัดระเบียบกล่องข้อมูลเหล่านี้ให้เป็นไปตามหลักการเขียนโปรแกรมที่ควรจะเป็น
3. 🧠 แก่นวิชา (Core Concepts)
ก่อนอื่นต้องเข้าใจก่อนว่า JavaScript เป็นภาษาแบบ Loosely Typed คือเราไม่ต้องบอกระบบว่ากล่องนี้ต้องเก็บตัวเลขหรือข้อความเท่านั้น กล่อง 1 ใบสามารถเก็บข้อมูลเปลี่ยนประเภทไปมาได้อิสระครับ
ทีนี้เรามาดู “3 รูปแบบ” ในการประกาศตัวแปรกัน:
1. var (The Legacy Box - รุ่นเก๋าจอมทะลุมิติ)
- Scope: ทำงานแบบ Function Scope หมายความว่าถ้าเราประกาศ
varไว้ในฟังก์ชัน มันจะถูกกักขังไว้ในฟังก์ชันนั้นก็จริง แต่ถ้าเราประกาศไว้ในบล็อกคำสั่งย่อยๆ อย่างifหรือforลูป ตัวแปรมันจะ “ทะลุ” (Leak) ออกมาให้ใช้ข้างนอกบล็อกได้สบายๆ! - Hoisting: มีพฤติกรรมที่เรียกว่า Hoisting คือระบบจะดึงการประกาศตัวแปรไปไว้ “บนสุด” ของ Scope เสมอ ทำให้เราสามารถเรียกใช้ตัวแปร
varได้ตั้งแต่บรรทัดที่ยังไม่ได้ประกาศโค้ด โดยจะได้ค่าเป็นundefinedออกมา
2. let (The Modern Box - รุ่นใหม่ ไฉไล เป็นระเบียบ)
- Scope: ทำงานแบบ Block Scope เหมือนภาษาโปรแกรมมิ่งสากลทั่วไป กล่องจะถูกจำกัดบริเวณอยู่แค่ในปีกกา
{ ... }ที่มันเกิดมาเท่านั้น ไม่มีอาการทะลุบล็อกอีกต่อไป - TDZ (Temporal Dead Zone): แม้
letจะมี Hoisting เหมือนกัน แต่มันฉลาดกว่าตรงที่ มันจะกักตัวแปรนั้นไว้ในโซนต้องห้าม (TDZ) จนกว่าโค้ดจะรันมาถึงบรรทัดที่ประกาศจริงๆ หากเราเผลอไปเรียกใช้ก่อน มันจะไม่ยอมให้ค่าundefinedแต่จะฟ้องพังด้วยReferenceErrorทันที! ซึ่งช่วยให้เราหาบั๊กได้ง่ายขึ้นมาก - No Redeclaration: ไม่อนุญาตให้ประกาศตัวแปรชื่อซ้ำกันใน Scope เดียวกัน
3. const (The Immutable Box - กล่องปิดตาย)
- Behavior: ย่อมาจาก Constant ใช้ประกาศค่าคงที่ มีคุณสมบัติ Block Scope และ TDZ เหมือน
letทุกประการ - Immutable Reference: เมื่อสร้างแล้ว “ต้องกำหนดค่าเริ่มต้นทันที” และ “ห้ามนำกล่องนี้ไปชี้ที่ของชิ้นใหม่” เด็ดขาด (Reassignment is not allowed)

4. 💻 ร่ายมนต์โค้ด (Show me the Code)
มาดูความแตกต่างของการทำงานจริงในระดับโค้ดกันครับ:
// ❌ 1. ปัญหาของ var (Scope Leak & Hoisting)
console.log(oldBox); // ไม่ Error นะ! แต่ได้ค่า "undefined" เพราะ Hoisting
var oldBox = "Old Data";
if (true) {
var secret = "1234"; // ประกาศในบล็อก if
}
console.log(secret); // "1234" อ้าว! ทะลุออกมานอก if เฉยเลย
// ✅ 2. ความปลอดภัยของ let (Block Scope & TDZ)
// console.log(newBox); // ถ้าเปิดคอมเมนต์บรรทัดนี้ จะ Error ทันที (TDZ)
let newBox = "New Data";
if (true) {
let blockData = "Safe inside";
console.log(blockData); // ใช้งานได้ปกติ
}
// console.log(blockData); // Error: blockData is not defined! ปลอดภัยมาก ไม่ทะลุออกมา
// 🔒 3. ข้อพึงระวังของ const (Constant)
const PI = 3.14159;
// PI = 3.14; // TypeError: Assignment to constant variable. เปลี่ยนค่าไม่ได้!
// ⚠️ Trick ของคนเขียน JS: const กับ Object/Array
const myProfile = { name: "Wisit" };
// แม้จะเป็น const แต่เราแก้ "ไส้ใน" ของมันได้นะ!
myProfile.name = "Tony";
console.log(myProfile.name); // "Tony"
// ที่ทำได้เพราะเราไม่ได้เปลี่ยนตัวกล่อง myProfile แต่เราแค่หยิบของข้างในกล่องมาเปลี่ยน
5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ในฐานะโปรแกรมเมอร์ที่มีประสบการณ์ พี่ขอแชร์กฎเหล็กทองคำ (Golden Rules) ที่ใช้กันในวงการ Industry ปัจจุบันครับ:
- 🚫 บอกลา
varไปได้เลย: ในยุค Modern JavaScript (ES6+) เราแทบจะไม่มีความจำเป็นต้องใช้varอีกต่อไป การเลิกใช้varจะช่วยลดบั๊กแปลกๆ ที่เกิดจาก Hoisting และ Global Namespace Pollution ได้มหาศาล - 👑 ยกให้
constเป็นพระเอก: จงใช้constเป็นค่าเริ่มต้น (Default) เสมอเวลาสร้างตัวแปรใหม่ เพราะเมื่อคุณและเพื่อนร่วมทีมอ่านโค้ด การเห็นคำว่าconstเป็นการสื่อสารที่ชัดเจนว่า “ตัวแปรนี้จะไม่มีวันถูกเปลี่ยนค่าใหม่” มันช่วยลดภาระสมองในการไล่ตามอ่านการทำงานของโค้ดได้อย่างดีเยี่ยม - 🔄 ใช้
letเฉพาะเมื่อต้องเปลี่ยนค่า: เราจะสลับมาใช้letก็ต่อเมื่อเราแน่ใจว่าตัวแปรนั้นๆ ต้องมีการบวกเพิ่ม หรือกำหนดค่าใหม่ในภายหลังเท่านั้น (เช่น ตัวแปรiในการวนลูปforหรือสวิตช์เปิดปิดสถานะต่างๆ)
6. 🏁 บทสรุป (To be continued…)
จะเห็นได้ว่าวิวัฒนาการจาก var มาสู่ let และ const ไม่ใช่แค่เรื่องของคำศัพท์ที่เปลี่ยนไป แต่มันคือการปิดช่องโหว่ด้านความปลอดภัยและโครงสร้างของภาษา JavaScript ให้มีความน่าเชื่อถือและเป็นระเบียบมากยิ่งขึ้น
จำง่ายๆ ครับ: เลิกใช้ var, เริ่มด้วย const, และใช้ let เมื่อต้องเปลี่ยนค่า!
ในตอนหน้า เราจะมาดูกันต่อว่า นอกจากตัวแปรแล้ว ข้อมูล (Data Types) แบบลึกๆ ใน JavaScript มีอะไรให้เราต้องระวังอีกบ้าง เตรียมตัวให้พร้อม แล้วเจอกันใหม่ครับ!
ต้องการที่ปรึกษาและพัฒนาระบบ Automation หรือ Web Application ให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p