JS กวดวิชา

เจเอสโฮม JS Introduction JS Where To JS เอาท์พุต งบ JS JS ไวยากรณ์ JS ความคิดเห็น ตัวแปร JS เจเอส เลท JS Const JS Operators JS เลขคณิต JS Assignment ประเภทข้อมูล JS ฟังก์ชัน JS วัตถุ JS JS Events JS Strings JS String Methods JS String Search เทมเพลตสตริง JS JS Numbers JS Number Methods JS Arrays JS Array Methods JS Array Sort JS Array Iteration JS Array Const JS Dates รูปแบบวันที่ JS JS วันที่รับเมธอด JS Date Set Methods JS Math JS สุ่ม JS Booleans JS เปรียบเทียบ JS Conditions JS Switch JS ลูปสำหรับ JS Loop สำหรับ In JS วนสำหรับ Of JS วนรอบในขณะที่ JS Break JS Iterables JS ชุด JS Maps JS Typeof JS ประเภทการแปลง JS Bitwise JS RegExp JS Errors JS ขอบเขต JS Hoisting JS โหมดเข้มงวด JS คำสำคัญนี้ JS Arrow Function JS Classes JS JSON JS Debugging คู่มือสไตล์ JS JS แนวทางปฏิบัติที่ดีที่สุด JS ความผิดพลาด JS Performance JS สงวนคำ

เวอร์ชัน JS

เวอร์ชัน JS JS 2009 (ES5) เจเอส 2015 (ES6) JS 2016 JS 2017 JS 2018 JS IE / ขอบ JS History

วัตถุ JS

คำจำกัดความของวัตถุ คุณสมบัติของวัตถุ วิธีการวัตถุ การแสดงวัตถุ อุปกรณ์เสริมวัตถุ ตัวสร้างวัตถุ ต้นแบบวัตถุ วัตถุ Iterables ชุดวัตถุ แผนที่วัตถุ การอ้างอิงวัตถุ

ฟังก์ชัน JS

คำจำกัดความของฟังก์ชัน พารามิเตอร์ฟังก์ชัน เรียกใช้ฟังก์ชัน เรียกฟังก์ชัน ฟังก์ชัน สมัคร การปิดฟังก์ชัน

JS Classes

แนะนำคลาส การสืบทอดคลาส คลาสคงที่

JS Async

JS Callbacks JS แบบอะซิงโครนัส JS Promises JS Async/รอ

JS HTML DOM

บทนำ DOM วิธี DOM เอกสาร DOM องค์ประกอบ DOM DOM HTML แบบฟอร์ม DOM DOM CSS ภาพเคลื่อนไหว DOM กิจกรรม DOM DOM Event Listener การนำทาง DOM โหนด DOM DOM Collections รายการโหนด DOM

JS เบราว์เซอร์ BOM

JS Window JS Screen JS Location JS History JS Navigator JS Popup Alert JS Timing JS Cookies

JS Web APIs

แนะนำ Web API เว็บฟอร์ม API API ประวัติเว็บ API ที่เก็บข้อมูลเว็บ Web Worker API API ดึงเว็บ เว็บ Geolocation API

JS AJAX

บทนำ AJAX AJAX XMLHttp คำขอ AJAX การตอบสนอง AJAX ไฟล์ AJAX XML AJAX PHP AJAX ASP ฐานข้อมูล AJAX แอปพลิเคชัน AJAX ตัวอย่าง AJAX

JS JSON

บทนำ JSON ไวยากรณ์ JSON JSON กับ XML ประเภทข้อมูล JSON JSON Parse JSON สตริงริฟาย วัตถุ JSON อาร์เรย์ JSON เซิร์ฟเวอร์ JSON JSON PHP JSON HTML JSON JSONP

JS กับ jQuery

ตัวเลือก jQuery jQuery HTML jQuery CSS jQuery DOM

JS กราฟิก

JS กราฟิก JS Canvas JS Plotly JS Chart.js JS Google Chart JS D3.js

ตัวอย่าง JS

ตัวอย่าง JS JS HTML DOM JS HTML อินพุต JS HTML Objects JS HTML Events JS Browser JS Editor JS แบบฝึกหัด JS Quiz ใบรับรอง JS

JS References

วัตถุ JavaScript วัตถุ HTML DOM


การปิด 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 ทำให้ฟังก์ชันมีตัวแปร " ส่วนตัว " ได้

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

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