การปิด JavaScript
ตัวแปร JavaScript สามารถเป็นของขอบเขตโลคัลหรือ โกลบอล
ตัวแปรโกลบอลสามารถทำให้เป็นท้องถิ่น (ส่วนตัว) ด้วยการปิด
ตัวแปรทั่วโลก
A function
สามารถเข้าถึงตัวแปรทั้งหมดที่กำหนดไว้ภายในฟังก์ชันได้ดังนี้:
ตัวอย่าง
function myFunction() {
let a = 4;
return a * a;
}
แต่ a function
ยังสามารถเข้าถึงตัวแปรที่กำหนดนอกฟังก์ชันได้ เช่นนี้
ตัวอย่าง
let a = 4;
function myFunction() {
return a * a;
}
ในตัวอย่างที่แล้วaคือ ตัวแปรส่วนกลาง
ในหน้าเว็บ ตัวแปรส่วนกลางเป็นของวัตถุหน้าต่าง
ตัวแปรส่วนกลางสามารถใช้ได้ (และเปลี่ยนแปลง) โดยสคริปต์ทั้งหมดในหน้า (และในหน้าต่าง)
ในตัวอย่างแรกaคือ ตัวแปรท้องถิ่น
ตัวแปรโลคัลสามารถใช้ได้เฉพาะในฟังก์ชันที่กำหนดไว้เท่านั้น มันถูกซ่อนจากฟังก์ชันอื่นๆ และโค้ดสคริปต์อื่นๆ
ตัวแปรโกลบอลและโลคัลที่มีชื่อเดียวกันเป็นตัวแปรที่แตกต่างกัน ปรับเปลี่ยนอย่างใดอย่างหนึ่งไม่แก้ไขอื่น ๆ
ตัวแปรที่สร้างขึ้นโดยไม่มีคีย์เวิร์ดการประกาศ ( var
,
let
, หรือconst
) จะเป็นค่าโกลบอลเสมอ แม้ว่าจะถูกสร้างขึ้นภายในฟังก์ชันก็ตาม
ตัวอย่าง
function myFunction() {
a = 4;
}
อายุการใช้งานตัวแปร
ตัวแปรร่วมจะคงอยู่จนกว่าหน้าจะถูกยกเลิก เช่น เมื่อคุณไปยังหน้าอื่นหรือปิดหน้าต่าง
ตัวแปรท้องถิ่นมีอายุสั้น สร้างขึ้นเมื่อมีการเรียกใช้ฟังก์ชัน และลบเมื่อฟังก์ชันเสร็จสิ้น
ภาวะที่กลืนไม่เข้าคายไม่ออก
สมมติว่าคุณต้องการใช้ตัวแปรในการนับบางสิ่ง และคุณต้องการให้ตัวนับนี้ใช้ได้กับทุกฟังก์ชัน
คุณสามารถใช้ตัวแปรส่วนกลาง และ a function
เพื่อเพิ่มตัวนับ:
ตัวอย่าง
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The counter should now be 3
มีปัญหากับวิธีแก้ปัญหาข้างต้น: รหัสใดๆ บนหน้าสามารถเปลี่ยนตัวนับ โดยไม่ต้องเรียก add()
ตัวนับควรอยู่ภายในadd()
ฟังก์ชัน เพื่อป้องกันไม่ให้โค้ดอื่นเปลี่ยนแปลง:
ตัวอย่าง
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 0
ใช้งานไม่ได้เนื่องจากเราแสดงตัวนับส่วนกลางแทนตัวนับในเครื่อง
เราสามารถลบตัวนับส่วนกลางและเข้าถึงตัวนับในพื้นที่โดยให้ฟังก์ชันส่งคืน:
ตัวอย่าง
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
return counter;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 1.
มันใช้งานไม่ได้เพราะเรารีเซ็ตตัวนับในเครื่องทุกครั้งที่เราเรียกใช้ฟังก์ชัน
ฟังก์ชันภายในของ JavaScript สามารถแก้ปัญหานี้ได้
ฟังก์ชันซ้อนกันของ JavaScript
ฟังก์ชันทั้งหมดสามารถเข้าถึงขอบเขตส่วนกลางได้
ที่จริงแล้ว ใน JavaScript ฟังก์ชันทั้งหมดสามารถเข้าถึงขอบเขต "ด้านบน" ได้
JavaScript รองรับฟังก์ชันที่ซ้อนกัน ฟังก์ชันที่ซ้อนกันสามารถเข้าถึงขอบเขต "ด้านบน" ได้
ในตัวอย่างนี้ ฟังก์ชันภายในplus()
สามารถเข้าถึงcounter
ตัวแปรในฟังก์ชันหลักได้:
ตัวอย่าง
function add() {
let counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
สิ่งนี้สามารถแก้ไขภาวะที่กลืนไม่เข้าคายไม่ออก ถ้าเราเข้าถึงplus()
ฟังก์ชันจากภายนอกได้
เรายังต้องหาวิธีดำเนินการcounter = 0
เพียงครั้งเดียว
เราต้องการการปิด
การปิด JavaScript
จำฟังก์ชันเรียกตัวเองได้หรือไม่? ฟังก์ชั่นนี้ทำอะไร?
ตัวอย่าง
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
// the counter is now 3
ตัวอย่างที่อธิบาย
ตัวแปรadd
ถูกกำหนดให้กับค่าส่งคืนของฟังก์ชันเรียกตัวเอง
ฟังก์ชันเรียกตัวเองทำงานเพียงครั้งเดียว มันตั้งค่าตัวนับเป็นศูนย์ (0) และส่งกลับนิพจน์ของฟังก์ชัน
วิธี add นี้จะกลายเป็นฟังก์ชัน ส่วนที่ "วิเศษ" คือสามารถเข้าถึงตัวนับในขอบเขตหลักได้
สิ่งนี้เรียกว่าการปิด JavaScript ทำให้ฟังก์ชันมีตัวแปร " ส่วนตัว " ได้
ตัวนับได้รับการคุ้มครองโดยขอบเขตของฟังก์ชันที่ไม่ระบุตัวตน และสามารถเปลี่ยนได้โดยใช้ฟังก์ชันเพิ่มเท่านั้น
การปิดเป็นฟังก์ชันที่สามารถเข้าถึงขอบเขตหลักได้ แม้ว่าฟังก์ชันหลักจะปิดไปแล้วก็ตาม