Skip to content

Scope & Closures

Scope กำหนดว่าตัวแปรจะ มองเห็นและเข้าถึงได้จากตรงไหนใน code

// Global scope
const globalVar = "ทุกที่เห็น";
function example() {
// Function scope
const funcVar = "เห็นเฉพาะใน function";
if (true) {
// Block scope
const blockVar = "เห็นเฉพาะใน block {}";
let alsoBlock = "let ก็ block-scoped";
var notBlock = "var เป็น function-scoped!";
}
console.log(notBlock); // ✅ var หลุด block
// console.log(blockVar); // ❌ ReferenceError
}

JavaScript ค้นหาตัวแปรจากใน → นอก:

const color = "แดง"; // global
function outer() {
const size = "ใหญ่"; // outer scope
function inner() {
const shape = "วงกลม"; // inner scope
// inner เห็นทุกตัว
console.log(color, size, shape); // "แดง", "ใหญ่", "วงกลม"
}
inner();
// console.log(shape); // ❌ ReferenceError
}

Closure เกิดเมื่อ function จำ scope ที่มันถูกสร้าง แม้จะถูกเรียกจากที่อื่น:

function createCounter(start = 0) {
let count = start; // ตัวแปรนี้ถูก "ปิด" ไว้ใน closure
return {
increment: () => ++count,
decrement: () => --count,
getCount: () => count,
};
}
const counter = createCounter(10);
console.log(counter.increment()); // 11
console.log(counter.increment()); // 12
console.log(counter.getCount()); // 12
// count เข้าถึงตรง ๆ ไม่ได้ — เป็น private!

ตัวอย่าง Closure ที่พบบ่อย

Section titled “ตัวอย่าง Closure ที่พบบ่อย”
// สร้าง function ที่จำ multiplier
function multiplier(factor) {
return (number) => number * factor;
}
const double = multiplier(2);
const triple = multiplier(3);
console.log(double(5)); // 10
console.log(triple(5)); // 15

IIFE (Immediately Invoked Function Expression)

Section titled “IIFE (Immediately Invoked Function Expression)”
// IIFE — ประกาศแล้วเรียกทันที
const result = (function() {
const secret = "hidden";
return secret.toUpperCase();
})();
console.log(result); // "HIDDEN"
// console.log(secret); // ❌ ReferenceError
// Arrow IIFE
const config = (() => {
const env = "production";
return { env, debug: env !== "production" };
})();