ขอบเขตเป็นสิ่งสำคัญที่สุดในภาษาการเขียนโปรแกรมใด ๆ เสมอเพราะมันควบคุมการมองเห็นและวงจรชีวิตของตัวแปรและพารามิเตอร์ การพูดถึงสิ่งนี้ก่อนอื่นเข้าใจแนวคิดสองแนวคิด: ขอบเขตระดับบล็อกและขอบเขตฟังก์ชัน
ขอบเขตระดับบล็อกคืออะไร?
คำสั่งที่ตั้งไว้ในคู่ของการจัดฟันแบบหยิก ({และ}) เป็นของบล็อกและตัวแปรทั้งหมดที่กำหนดไว้ในสิ่งนี้จะมองไม่เห็นนอกบล็อกรหัสซึ่งเราเรียกขอบเขตระดับบล็อก
ขอบเขตของฟังก์ชั่นนั้นง่ายต่อการเข้าใจ (*^__^*) และพารามิเตอร์และตัวแปรที่กำหนดไว้ในฟังก์ชั่นนั้นมองไม่เห็นนอกฟังก์ชั่น
ภาษา C-class ส่วนใหญ่มีขอบเขตระดับบล็อก แต่ JS ไม่ได้ โปรดดูการสาธิตด้านล่าง:
// C ภาษา#รวม <stdio.h> void main () {int i = 2; ฉัน--; if (i) {int j = 3; } printf ("%d/n", j); -เมื่อเรียกใช้รหัสนี้ข้อผิดพลาดของ "ใช้ตัวแปรที่ไม่ได้กำหนด: J" จะปรากฏขึ้น อย่างที่คุณเห็นภาษา C มีขอบเขตระดับบล็อกเนื่องจาก J ถูกกำหนดไว้ในบล็อกคำสั่งของ IF ดังนั้นจึงไม่สามารถเข้าถึงได้นอกบล็อก
และ JS ทำงานอย่างไรลองดูตัวอย่างอื่น:
functin test () {สำหรับ (var i = 0; i <3; i ++) {} การแจ้งเตือน (i); } ทดสอบ();เรียกใช้รหัสนี้และ "3" ปรากฏขึ้น จะเห็นได้ว่านอกบล็อกตัวแปรที่ฉันกำหนดไว้ในบล็อกยังสามารถเข้าถึงได้ นั่นคือ JS ไม่รองรับขอบเขตระดับบล็อก แต่รองรับขอบเขตฟังก์ชันเท่านั้นและตัวแปรที่กำหนดไว้ที่ใดก็ได้ในฟังก์ชั่นสามารถมองเห็นได้ทุกที่ในฟังก์ชันนั้น
แล้วเราจะทำให้ JS มีขอบเขตระดับบล็อกได้อย่างไร? คุณยังจำได้หรือไม่ว่าเมื่อตัวแปรที่กำหนดในฟังก์ชั่นเรียกว่าตัวแปรจะถูกทำลาย? เราสามารถใช้คุณสมบัตินี้เพื่อจำลองขอบเขตระดับบล็อกของ JS ได้หรือไม่? ดูการสาธิตต่อไปนี้:
ฟังก์ชั่นทดสอบ () {(ฟังก์ชัน () {สำหรับ (var i = 0; i <4; i ++) {}}) (); การแจ้งเตือน (i); } ทดสอบ();เรียกใช้อีกครั้งในเวลานี้ข้อผิดพลาดที่ไม่ได้กำหนดของ "ฉัน" จะปรากฏขึ้น ฮ่าฮ่ามันถูกนำไปใช้ ~~~ ที่นี่เราใส่บล็อกคำสั่งลงในการปิดและเรียกใช้ฟังก์ชั่นนี้ เมื่อการเรียกใช้ฟังก์ชันเสร็จสิ้นตัวแปรที่ฉันจะถูกทำลายโดยอัตโนมัติดังนั้นเราจึงไม่สามารถเข้าถึงได้นอกบล็อก
คุณสมบัติการปิดของ JS เป็นคุณสมบัติที่สำคัญที่สุด ((*^__^*) ทุกคนเข้าใจ) ใน JS เพื่อป้องกันความขัดแย้งในการตั้งชื่อเราควรพยายามหลีกเลี่ยงการใช้ตัวแปรทั่วโลกและฟังก์ชั่นทั่วโลก แล้วจะหลีกเลี่ยงได้อย่างไร? ตกลงดังที่แสดงในการสาธิตข้างต้นเราสามารถใส่ทุกอย่างที่เราต้องการกำหนดไว้ในหนึ่งเดียว
(function () {// content}) ();ในหมู่พวกเขาในเวลานี้มันเทียบเท่ากับการเพิ่มขอบเขตฟังก์ชันให้กับเลเยอร์ด้านนอกของพวกเขาหรือไม่? โปรแกรมนอกขอบเขตนี้ไม่สามารถเข้าถึงได้