กฎทองแรก:
JS ไม่มีขอบเขตระดับบล็อก (คุณสามารถนำไปใช้ด้วยตัวเองด้วยการปิดหรือวิธีการอื่น ๆ ) เพียงขอบเขตระดับฟังก์ชั่น ตัวแปรภายนอกฟังก์ชั่นสามารถพบได้ในฟังก์ชั่น แต่ตัวแปรภายในฟังก์ชั่นไม่สามารถพบได้นอก
FIRSTTRY:
ทำไมถึงเป็นเช่นนี้? -
var a = 10; ฟังก์ชั่น aaa () {// step-4Alert (a); // step-5-> เรียกใช้การแจ้งเตือนในเวลานี้คุณสามารถค้นหาภายนอก a = 10 ดังนั้นกล่องป๊อปอัพ 10} ฟังก์ชัน bbb () {// step-2var a = 20; aaa ()ในความเป็นจริงทุกคนเข้าใจหลักการมันควรจะเป็นเรื่องของความผิดพลาดง่าย ๆ และทุกอย่างจะเปลี่ยนไป
SecondTry:
ทำไมถึงเป็นเช่นนี้? เพราะเมื่อ A ถูกกำหนด B, B ยังไม่ได้กำหนดไว้ดังนั้น A จะไม่ได้กำหนดและ B คือ 10
บทความ 2 ของรหัสทอง:
การค้นหาตัวแปรเป็นหลักการของความใกล้ชิด ในการค้นหาตัวแปรที่กำหนดโดย VAR เมื่อไม่พบในบริเวณใกล้เคียงจากนั้นค้นหาเลเยอร์ด้านนอก
ดู:
ทำไมถึงเป็นเช่นนี้? มีสองเหตุผลสำหรับสิ่งนี้: หนึ่งคือการวิเคราะห์ล่วงหน้าและอีกเหตุผลหนึ่งกำลังค้นหาใกล้เคียง
var a = 10; ฟังก์ชั่น aaa () {แจ้งเตือน (a); // undefined เมื่อค้นหา A คุณจะค้นหาในฟังก์ชั่น เนื่องจากผลของการเตรียมล่วงหน้า A ไม่ได้กำหนดในเวลานี้ดังนั้นคุณจะไม่มองหาภายนอก 10 var a = 20;/*เตรียม var aalert (a); var a = 20;*/} aaa ();ความสนใจ:
มาตรวจสอบรายการที่สองกันเถอะ แม้ว่ามันจะเป็นหลักการของความใกล้ชิด แต่ก็คือการค้นหาตัวแปรที่ประกาศโดย VAR ใกล้เคียง นี่เป็นเพราะตัวแปรที่ประกาศโดย VAR นั้นเป็นทั่วโลก ที่นี่ค่าของ A เป็นเพียงการแก้ไข ดังนั้นข้างต้นจึงเป็นเพราะไม่พบ A VAR ในฟังก์ชั่นดังนั้นฉันจึงออกไปข้างนอกและพบมันทันทีที่ฉันค้นหาดังนั้นจึงแจ้งเตือนออกมา 10; แต่ความจริงก็คือหลังจาก A = 20, A คือ 20 แน่นอน แต่มันยังไม่ได้ดำเนินการเมื่อได้รับการแจ้งเตือน ~~
ดู ~
ตัวอย่างต่อไปนี้ตรวจสอบขอบเขตฟังก์ชันของ JS:
นี่เป็นเพราะเมื่อการแจ้งเตือน (a), A ในฟังก์ชั่น BBB คือ 20 แต่เป็นท้องถิ่นของการแจ้งเตือนประโยค (A) ในเวลานี้ การแจ้งเตือน (a) ไม่พบในฟังก์ชั่น BBB ดังนั้นจึงไม่สามารถหาได้ในฟังก์ชั่น AAA ดังนั้นมันจึงออกไปข้างนอกและพบ 10
มาตรา 3 ของรหัสทอง:
เมื่อพารามิเตอร์ซ้ำกับตัวแปรท้องถิ่นลำดับความสำคัญจะเทียบเท่า
ตัวอย่าง:
นอกจากนี้: เมื่อผ่านพารามิเตอร์ประเภทพื้นฐานจะผ่านค่าและประเภทการอ้างอิงจะผ่านการอ้างอิง (แต่ไม่ใช่กรณีหลังจากการมอบหมายใหม่)
var a = 5; var b = a; b += 3; การแจ้งเตือน (a); // 5var a = [1,2,3]; var b = a; b.push (4); แจ้งเตือน (a); // [1,2,3,4];
ไม่มีปัญหากับรหัสข้างต้น แต่สิ่งต่อไปนี้แตกต่างกัน
เนื่องจาก B ถูกกำหนดใหม่จึงไม่ชี้ไปที่
นอกจากนี้ขอบเขตของพารามิเตอร์และตัวแปรก็คล้ายกัน:
เปรียบเทียบสองนี้:
พารามิเตอร์ข้างต้นเป็นประเภทพื้นฐานและเฉพาะค่าที่ผ่านเข้ามาต่อไปนี้เป็นประเภทอ้างอิง: (รวมถึงกรณีของการกำหนดใหม่)