การปิดฟังก์ชัน JavaScript


สารบัญ

    แสดงสารบัญ


ตัวแปร JavaScript สามารถอยู่ใน local หรือ ขอบเขตทั่วโลก

ตัวแปรโกลบอลสามารถกำหนดให้อยู่ในเครื่อง (ส่วนตัว) ด้วย การปิด


ตัวแปรร่วม

function สามารถเข้าถึงตัวแปรทั้งหมดที่กำหนดไว้ ภายใน ฟังก์ชัน เช่นนี้:

ตัวอย่าง

function myFunction() {
    let a = 4;
    return a * a;
}

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Functions</h2>
<p>A function can access variables defined inside the function:</p>

<p id="demo"></p>

<script>
myFunction();

function myFunction() {
  let a = 4;
  document.getElementById("demo").innerHTML = a * a;
}
</script>

</body>
</html>

แต่ function ยังสามารถเข้าถึงตัวแปรที่กำหนด ภายนอก ฟังก์ชันได้ เช่นนี้:

ตัวอย่าง

let a = 4;
function myFunction() {
    return a * a;
}

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Functions</h2>
<p>A function can access variables defined outside the function:</p>

<p id="demo"></p>

<script>
let a = 4;
myFunction();

function myFunction() {
  document.getElementById("demo").innerHTML = a * a;
} 
</script>

</body>
</html>

ในตัวอย่างสุดท้าย a คือ ทั่วโลก ตัวแปร.

ในหน้าเว็บ ตัวแปรร่วมจะอยู่ในหน้าเว็บ

ตัวแปรร่วมสามารถใช้ (และเปลี่ยนแปลง) โดยสคริปต์อื่นๆ ทั้งหมดในเพจ

ในตัวอย่างแรก a คือ ท้องถิ่น ตัวแปร.

ตัวแปรท้องถิ่นสามารถใช้ได้ภายในฟังก์ชันที่กำหนดไว้เท่านั้น มัน ถูกซ่อนจากฟังก์ชันอื่นๆ และโค้ดสคริปต์อื่นๆ

ทั่วโลก และตัวแปรท้องถิ่นที่มีชื่อเดียวกันคือ ตัวแปรที่แตกต่างกัน การแก้ไขอันหนึ่งไม่ได้แก้ไขอันอื่น

บันทึก

ตัวแปรที่สร้าง โดยไม่มี คำหลักสำหรับการประกาศ (var, ให้ หรือ const) อยู่เสมอ global แม้ว่าจะถูกสร้างขึ้นภายในฟังก์ชันก็ตาม

ตัวอย่าง

function myFunction() {
  a = 4;
}

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Functions</h2>
<p>Variables created without a declaration keyword (var, let, or const) are always global,
even if they are created inside a function.:</p>

<p id="demo"></p>

<script>
myFunction();
document.getElementById("demo").innerHTML = a * a;

function myFunction() {
  a = 4;
} 
</script>

</body>
</html>


อายุการใช้งานที่เปลี่ยนแปลงได้

ตัวแปรร่วมจะมีผลจนกว่าเพจจะถูกละทิ้ง เช่น เมื่อคุณนำทาง ไปยังหน้าอื่นหรือปิดหน้าต่าง

ท้องถิ่น ตัวแปรมีอายุสั้น พวกมันถูกสร้างขึ้นเมื่อมีฟังก์ชัน เรียกใช้และลบออกเมื่อฟังก์ชันเสร็จสิ้น


ภาวะที่กลืนไม่เข้าคายไม่ออก

สมมติว่าคุณต้องการใช้ตัวแปรในการนับบางสิ่ง และคุณต้องการสิ่งนี้ เคาน์เตอร์ให้ใช้งานได้ครบทุกฟังก์ชั่น

คุณสามารถใช้ตัวแปรส่วนกลางและ ฟังก์ชัน เพื่อเพิ่มตัวนับ:

ตัวอย่าง

 // 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

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Function Closures</h2>
<p>Counting with a global variable.</p>

<p id="demo"></p>

<script>
// 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
document.getElementById("demo").innerHTML = "The counter is: " + counter;
</script>

</body>
</html>

มีปัญหากับวิธีแก้ปัญหาข้างต้น: โค้ดใดๆ บนเพจสามารถเปลี่ยนตัวนับได้โดยไม่ต้อง โทรเพิ่ม()

ตัวนับควรอยู่ในฟังก์ชัน 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

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Function Closures</h2>
<p>Counting with a local variable.</p>

<p id="demo"></p>

<script>
// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  let counter = 0; 
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

// The result is not 3 because you mix up the globaland local counter
document.getElementById("demo").innerHTML = "The counter is: " + counter;
</script>

</body>
</html>

มันใช้งานไม่ได้เนื่องจากเราแสดงตัวนับส่วนกลางแทนที่จะเป็นตัวนับในพื้นที่ เคาน์เตอร์.

เราสามารถลบตัวนับทั่วโลกและเข้าถึงตัวนับในพื้นที่ได้โดยให้ ฟังก์ชั่นส่งคืน:

ตัวอย่าง

 // 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.

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Closures</h2>
<p>Counting with a local variable.</p>

<button type="button" onclick="myFunction()">Count!</button>

<p id="demo">0</p>

<script>
// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
  return counter;
}
// Trying to increment the counter
function myFunction(){
  document.getElementById("demo").innerHTML = add();
}
</script>

</body>
</html>

มันใช้งานไม่ได้เพราะเรารีเซ็ตตัวนับในพื้นที่ทุกครั้งที่เราโทรหา การทำงาน.

ฟังก์ชันภายใน JavaScript สามารถแก้ปัญหานี้ได้


ฟังก์ชันที่ซ้อนกันของ JavaScript

ฟังก์ชั่นทั้งหมดสามารถเข้าถึงขอบเขตส่วนกลางได้

ในความเป็นจริงใน JavaScript ฟังก์ชั่นทั้งหมดสามารถเข้าถึงขอบเขต "ด้านบน" ได้

JavaScript รองรับฟังก์ชันที่ซ้อนกัน ฟังก์ชั่นที่ซ้อนกันสามารถเข้าถึงไฟล์ ขอบเขต "เหนือ" พวกเขา

ในตัวอย่างนี้ ฟังก์ชันภายใน plus() มีสิทธิ์เข้าถึง ไปยังตัวแปร counter ในฟังก์ชันพาเรนต์:

ตัวอย่าง

function add() {
    let counter = 0;
    function plus() {counter += 1;}
  plus();   
 
  return counter; 
}

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Function Closures</h2>
<p>Counting with a local variable.</p>

<p id="demo">0</p>

<script>
document.getElementById("demo").innerHTML = add();
function add() {
  let counter = 0;
  function plus() {counter += 1;}
  plus();  
  return counter; 
}
</script>

</body>
</html>

นี่อาจช่วยแก้ปัญหาที่กลืนไม่เข้าคายไม่ออกหากเราสามารถเข้าถึง plus() ฟังก์ชั่นจากภายนอก

นอกจากนี้เรายังต้องหาวิธีดำเนินการ counter=0 เพียงครั้งเดียว

เราจำเป็นต้องปิดตัวลง


การปิด JavaScript

จำฟังก์ชั่นที่เรียกตัวเองได้ไหม? ฟังก์ชั่นนี้ทำหน้าที่อะไร?

ตัวอย่าง

const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter}
})();
add();
add();
add();

// the counter is now 3

ลองด้วยตัวคุณเอง →

<!DOCTYPE html>
<html>
<body>

<h2>JavaScript Closures</h2>

<p>Counting with a local variable.</p>

<button type="button" onclick="myFunction()">Count!</button>

<p id="demo">0</p>

<script>
const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter;}
})();

function myFunction(){
  document.getElementById("demo").innerHTML = add();
}
</script>

</body>
</html>

ตัวอย่างอธิบาย

ตัวแปร add ถูกกำหนดให้กับค่าส่งคืนของการเรียกตัวเอง การทำงาน.

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

วิธีนี้ add จะกลายเป็นฟังก์ชัน ส่วนที่ "มหัศจรรย์" ก็คือสามารถเข้าถึงได้ ตัวนับในขอบเขตหลัก

สิ่งนี้เรียกว่า การปิด ของ JavaScript มันทำให้เป็นไปได้ เพื่อให้ฟังก์ชันมีตัวแปร "ส่วนตัว"

ตัวนับได้รับการคุ้มครองโดยขอบเขตของฟังก์ชันที่ไม่ระบุตัวตน และสามารถเปลี่ยนได้โดยใช้ฟังก์ชันเพิ่มเท่านั้น

การปิดคือฟังก์ชันที่มีสิทธิ์เข้าถึงขอบเขตหลัก แม้ว่าฟังก์ชันหลักจะปิดไปแล้วก็ตาม