การปิดคือการรวมกันของฟังก์ชันและสภาพแวดล้อมของคำศัพท์ซึ่งมีการประกาศฟังก์ชันนั้น
function outerFunc() { var name = "TutorialsPoint"; // name is a local variable created by outerFunc return function innerFunc() { // innerFunc() is the inner function, a closure console.log(name); // use variable declared in the parent function }; } let f = outerFunc(); f()
outerFunc() สร้างตัวแปรโลคัลชื่อ name และฟังก์ชั่นที่เรียกว่า innerFunc() ฟังก์ชัน innerFunc() เป็นฟังก์ชันภายในที่กำหนดไว้ภายใน outerFunc() และใช้ได้เฉพาะภายในเนื้อหาของฟังก์ชัน outerFunc()
โปรดทราบว่าฟังก์ชัน innerFunc() ไม่มีตัวแปรในเครื่องของตัวเอง อย่างไรก็ตาม เนื่องจากฟังก์ชัน inner สามารถเข้าถึงตัวแปรของฟังก์ชันภายนอกได้ innerFunc() จึงสามารถเข้าถึงชื่อตัวแปรที่ประกาศไว้ในฟังก์ชันหลักได้ outerFunc()
คุณจะเห็นว่าชื่อนั้นอยู่นอกขอบเขตเมื่อ outerFunc ดำเนินการเสร็จสิ้น แต่ถ้าคุณมองอย่างใกล้ชิด innerFunc ที่ส่งคืนและกำหนดให้กับ f ยังคงสามารถเข้าถึงตัวแปรชื่อได้ ดังนั้น inner func จึงปิดขอบเขตคำศัพท์ของ outerFunc
การใช้งานจริง
จำลองวิธีการส่วนตัว −ภาษาเช่น Java ให้ความสามารถในการประกาศเมธอดส่วนตัว หมายความว่าสามารถเรียกเมธอดอื่นในคลาสเดียวกันเท่านั้น JavaScript ไม่มีวิธีการดั้งเดิมในการทำเช่นนี้ แต่เป็นไปได้ที่จะเลียนแบบวิธีการส่วนตัวโดยใช้การปิด
ตัวอย่าง
var counter = (() => { var privateCounter = 0; let changeBy = (val) => privateCounter += val; return { increment: () => changeBy(1), decrement: () => changeBy(-1), value: () => privateCounter }; })(); console.log(counter.value()); counter.increment(); counter.increment(); console.log(counter.value()); counter.decrement(); console.log(counter.value());
ผลลัพธ์
0 2 1
ใช้กับตัวจัดการเหตุการณ์
for(let i = 0; i < 4; i++) { button = buttons[i] button.addEventListener("click", alert(i)) }
ถ้าคุณมีปุ่ม 4 ปุ่มในปุ่มคอลเลกชัน และพยายามเพิ่มตัวฟังเหตุการณ์เช่นนี้ การคลิกที่ปุ่มเหล่านั้นจะทำให้ผลลัพธ์ไม่ได้ถูกกำหนด นี่เป็นเพราะเมื่อพวกมันถูกเรียก ฉันจะไม่ถูกกำหนดอีกต่อไป วิธีแก้ไขคือแนะนำการปิดทับ i
for(let i = 0; i < 4; i++) { button = buttons[i] button.addEventListener("click", () => alert(i)) }