วันนี้ฝึกงานเล็กน้อยใน บริษัท ถามฉันถึงความแตกต่างระหว่างสองรหัส JS:
รหัส 1:
<script type = "text/javascript"> var a = "hello"; การทดสอบฟังก์ชั่น () {var a; การแจ้งเตือน (a); a = "โลก"; การแจ้งเตือน (a); } </script>รหัส 2:
<script type = "text/javascript"> var a = "hello"; การทดสอบฟังก์ชั่น () {แจ้งเตือน (a); a = "โลก"; การแจ้งเตือน (a); } </script>ฉันคิดว่ามันง่ายมาก มันไม่ใช่แค่ปัญหาขอบเขตระหว่างตัวแปรทั่วโลกและตัวแปรท้องถิ่นหรือไม่? ฉันพูดว่า: "เมื่อตัวแปรทั่วโลกถูกทำซ้ำกับตัวแปรท้องถิ่นขอบเขตของตัวแปรท้องถิ่นจะเขียนทับขอบเขตของตัวแปรทั่วโลกหลังจากออกจากขอบเขตของตัวแปรท้องถิ่นมันจะกลับไปสู่ขอบเขตของตัวแปรทั่วโลก
<script> var a = 1; การทดสอบฟังก์ชั่น () {แจ้งเตือน (a); var a = 2; การแจ้งเตือน (a); } ทดสอบ(); การแจ้งเตือน (a); </script>ผลลัพธ์เท่าเทียมกันคืออะไร? เป็นเอาต์พุต 1 2 1 หรือไม่? ฉันคิดอย่างนั้นก่อนที่ฉันจะส่งกรณีทดสอบให้เธอ แต่หลังจากการทดสอบเอาท์พุท ... ผลของการวิ่งนั้นไม่ได้กำหนด 2 1 ในเวลานั้นฉันก็งงงวยและถามครู GU ว่าฉันรู้ว่าฉันไม่รู้เรื่อง JS มากนักดังนั้นฉันจึงทำงานอย่างหนักเพื่อเรียนรู้ + การทดสอบ
1. ขอบเขตของตัวแปร JavaScript ถูกแบ่งตามบล็อกวิธีการ (นั่นคือมันถูกหารด้วยคู่ของการจัดฟัน {} ของฟังก์ชั่น) โปรดจำไว้ว่ามันเป็นบล็อกฟังก์ชั่นและสำหรับในขณะที่และถ้าบล็อกไม่ใช่เกณฑ์การแบ่งขอบเขต คุณสามารถดูตัวอย่างต่อไปนี้:
<script> ฟังก์ชั่น test2 () {แจ้งเตือน ("ก่อนหน้าสำหรับขอบเขต:"+i); // ฉันไม่ได้กำหนดค่า (ไม่ได้ประกาศ! ใช้ตัวแปรหรือฟังก์ชั่นที่ไม่ได้ประกาศเพื่อโยนข้อผิดพลาดที่ร้ายแรงและการดำเนินการสคริปต์ขัดจังหวะ) // ในเวลานี้ค่าของฉันถูก underfined สำหรับ (var i = 0; i <3; i ++) {แจ้งเตือน ( // ฉันคือ 0, 1, 2 และเมื่อฉันคือ 3, ลูปถูกกระโดด} การแจ้งเตือน ("หลังจากนั้นสำหรับขอบเขต:"+i); // ฉันคือ 3 โปรดทราบว่ามันอยู่ข้างนอกแล้วสำหรับขอบเขต แต่ฉันยังคงเก็บไว้เป็น 3 ในขณะที่ (จริง) {var j = 1; หยุดพัก; } Alert (J); // j คือ 1 โปรดทราบว่ามันเปิดอยู่แล้วในขณะที่อยู่นอกขอบเขตค่าของ j ยังคงอยู่ที่ 1 ถ้า (จริง) {var k = 1; } Alert (K); // ค่าของ K คือ 1 โปรดทราบว่ามันอยู่นอกขอบเขตอยู่แล้ว แต่ค่าของ K ยังคงอยู่ที่ 1} test2 (); // ถ้า (ขอบเขตฟังก์ชันภายนอก) เอาต์พุตของตัวแปร I, J และ K ที่มีอยู่ใน Test2 เท่านั้นจะมีเอฟเฟกต์เวทย์มนตร์หรือไม่? การแจ้งเตือน (i); //ข้อผิดพลาด! ถูกต้องมันเป็นข้อผิดพลาดเนื่องจากตัวแปรที่ฉันไม่ได้ประกาศ (ไม่ได้ออกแบบไม่ได้แยกแยะผลลัพธ์ของฟังก์ชั่นแรกของฟังก์ชั่น test2) ทำให้เกิดข้อผิดพลาดของสคริปต์และโปรแกรมจะสิ้นสุดที่นี่! การแจ้งเตือน ("บรรทัดนี้จะยังคงส่งออกหรือไม่"); // ไม่ดำเนินการแจ้งเตือน (j); // ไม่ดำเนินการแจ้งเตือน (k); // ไม่ได้ดำเนินการ </script>2. ก่อนการดำเนินการ JavaScript จะทำการวิเคราะห์อย่างสมบูรณ์ของส่วนการประกาศของไฟล์สคริปต์ทั้งหมด (รวมถึงตัวแปรท้องถิ่น) เพื่อกำหนดขอบเขตของตัวแปรจริง จะเข้าใจได้อย่างไร? ดูตัวอย่างต่อไปนี้:
<script> var a = 1; การทดสอบฟังก์ชั่น () {แจ้งเตือน (a); // a ไม่ได้กำหนด! นี่ไม่ใช่ตัวแปรทั่วโลกเนื่องจากตัวแปรท้องถิ่นที่ซ้ำกันได้ถูกประกาศในขอบเขตฟังก์ชัน (บรรทัดสุดท้ายของฟังก์ชันสุดท้าย) และ // ตัวแปรส่วนกลาง A ถูกเขียนทับซึ่งแสดงให้เห็นว่า JavaScript จะทำการวิเคราะห์ส่วนคำจำกัดความทั้งหมดของไฟล์สคริปต์ทั้งหมดก่อนการดำเนินการ ดังนั้นก่อนที่จะทำการทดสอบฟังก์ชั่น (), // ตัวแปร A ในร่างกายฟังก์ชั่นถูกชี้ไปที่ตัวแปรภายในภายในแทนที่จะเป็นตัวแปรทั่วโลกภายนอก แต่ในเวลานี้ A ได้รับการประกาศเท่านั้นและไม่ได้กำหนดค่าดังนั้นจึงไม่ได้กำหนดเอาต์พุต A = 4 การแจ้งเตือน (a); // a คือ 4 ไม่มีความสงสัย? A ที่นี่ยังคงเป็นตัวแปรท้องถิ่น! var a; // ตัวแปรท้องถิ่น A ประกาศแจ้งเตือน (a); // a ยังคงเป็น 4 เพราะ 4 ได้รับมอบหมายให้ทดสอบก่อน} (); การแจ้งเตือน (a); // a คือ 1 ซึ่งไม่ได้อยู่ในขอบเขตฟังก์ชันค่าของ A คือค่าของตัวแปรส่วนกลาง </script>3. เมื่อตัวแปรทั่วโลกถูกทำซ้ำกับตัวแปรท้องถิ่นขอบเขตของตัวแปรท้องถิ่นจะเขียนทับขอบเขตของตัวแปรทั่วโลก หลังจากออกจากขอบเขตของตัวแปรท้องถิ่นมันจะกลับสู่ขอบเขตของตัวแปรทั่วโลก เมื่อตัวแปรทั่วโลกเผชิญหน้ากับตัวแปรท้องถิ่นวิธีการใช้ตัวแปรส่วนกลาง? ใช้ window.globalvariablename
<script> var a = 1; การทดสอบฟังก์ชั่น () {แจ้งเตือน (window.a); // a คือ 1 นี่คือตัวแปรระดับโลก! var a = 2; // ตัวแปรท้องถิ่น A ถูกกำหนดในการแจ้งเตือนบรรทัดนี้ (a); // a คือ 2 และนี่คือตัวแปรท้องถิ่น! } ทดสอบ(); การแจ้งเตือน (a); // a คือ 1 มันไม่ได้อยู่ในขอบเขตฟังก์ชันค่าของ A คือค่าของตัวแปรส่วนกลาง </script>แน่นอนสำหรับบทความเพิ่มเติมโปรดดูบทความที่เกี่ยวข้องด้านล่าง