ECMAScript 闭包

ECMAScript ที่เกิดความเข้าใจผิดง่ายที่สุดคือมันสนับสนุน closure。

บล็อคคลอส หมายถึงฟังก์ชันที่รวมทั้งตัวแปรที่ไม่ถูกคำนวณ หมายความว่า ฟังก์ชันสามารถใช้ตัวแปรที่ถูกกำหนดนอกฟังก์ชัน

ตัวอย่างบล็อคคลอสที่เรียบง่าย

การใช้ตัวแปรสากลใน ECMAScript คือตัวอย่างของบล็อคคลอสที่เรียบง่าย

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

ในบรรทัดนี้ หลังจากสคริปต์ได้รับการโหลดเข้าหลังเครื่องหน้ามา ไม่ได้คำนวณค่าของตัวแปร sMessage ของฟังก์ชัน sayHelloWorld() ฟังก์ชันนี้จับค่า sMessage เพื่อใช้ในอนาคต หมายความว่า โปรแกรมเจอร์ร์รู้ว่าต้องตรวจสอบค่า sMessage ในตอนที่เรียกฟังก์ชัน sayHelloWorld() ค่า sMessage จะถูกกำหนดในตอนที่เรียกฟังก์ชัน sayHelloWorld() (บรรทัดสุดท้าย) และแสดงข้อความ "hello world"

ตัวอย่างบล็อคคลอสที่ซับซ้อน

การเขียนฟังก์ชันภายในฟังก์ชันทำให้บล็อคคลอส (closure) มีความซับซ้อนมากขึ้น ตัวอย่างเช่น:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

ที่นี่ ฟังก์ชัน addNum() รวมฟังก์ชัน doAdd() (บล็อคคลอส) ภายในฟังก์ชัน ซึ่งเป็นบล็อคคลอส เพราะมันจะรับค่าจากอุปกรณ์ของฟังก์ชันนอกและค่าของตัวแปรสากล iBaseNum ของฟังก์ชัน addNum() จะทำการเรียก doAdd() ด้วยสองอุปกรณ์และตัวแปรสากล และกลับค่าเป็นเมื่อเพิ่มค่าทั้งสองอุปกรณ์และตัวแปรสากล

ความสำคัญที่ต้องทราบคือ ฟังก์ชัน doAdd() ไม่รับอุปกรณ์ที่เป็นตัวแปร มันใช้ค่าจากสภาพแวดล้อมการปฏิบัติการ

จากการดูได้ชัดเจนว่า บล็อคคลอส (closure) คือส่วนที่แข็งแรงและมีความยอดเยี่ยมใน ECMAScript ที่สามารถใช้สำหรับการทำคำนวณที่ซับซ้อน

คำเตือน:เช่นเดียวกับการใช้ฟังก์ชันระดับสูง ในการใช้บล็อคคลอส (closure) ต้องระมัดระวัง เพราะมันอาจกลายเป็นสิ่งที่ซับซ้อนมาก