ดูรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
ถ้า (! ("AA" ในหน้าต่าง)) {
แจ้งเตือน ('โอ้พระเจ้าของฉัน');
var aa = 1;
-
การแจ้งเตือน ("AA" ในหน้าต่าง);
การแจ้งเตือน (AA);
ตอบคำถามต่อไปนี้:
จะมีการรายงานข้อผิดพลาดหรือไม่? มันจะปรากฏขึ้นกี่ครั้ง?
การแจ้งเตือนครั้งที่สองเป็นจริงหรือเท็จ?
เกิดอะไรขึ้นในการแจ้งเตือนครั้งที่สาม?
ทำไม
ลองคิดดูแล้วทดสอบ หากคุณตอบถูกต้องคุณไม่จำเป็นต้องอ่านบทความต่อไปนี้
-
การกำหนดตัวแปรใน JS นั้นง่ายเกินไป คุณสามารถใช้ var หรือแม้ไม่มี var:
การคัดลอกรหัสมีดังนี้:
var a = 1;
นี่คือชื่อตัวแปรและ 1 คือค่าตัวแปร อนิจจานี่เป็นพื้นฐานเกินไป ดูรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
var a;
การแจ้งเตือน (a);
ในการทดสอบ Firebug ที่ไม่ได้กำหนดจะปรากฏขึ้น นี่เป็นสตริงที่คุ้นเคยมากซึ่งดูเหมือนจะบ่งบอกว่าตัวแปรไม่ได้กำหนด แต่ฉันคิดว่าฉันได้เปลี่ยนแปลงไปแล้วนี่คือคำจำกัดความ แต่ไม่มีค่าใด ๆ ที่แนบมา
มาทำสิ่งที่ไม่ได้กำหนดจริงๆ:
การคัดลอกรหัสมีดังนี้:
การแจ้งเตือน (a);
ถูกต้องเพียงแค่แจ้งเตือนตัวแปรที่ไม่เคยปรากฏเลย จะเกิดอะไรขึ้น?
Firebug รายงานข้อผิดพลาดโดยตรง: A ไม่ได้กำหนดไว้ หมายความว่า A ไม่ได้กำหนด การรวมรหัสก่อนหน้านี้ทำให้เกิดความสับสน อะไรคือความแตกต่างระหว่างสิ่งนี้ที่ไม่ได้กำหนดและก่อนหน้านี้ที่ไม่ได้กำหนด?
ในความเป็นจริงรหัสก่อนหน้านี้เทียบเท่ากับสิ่งนี้:
การคัดลอกรหัสมีดังนี้:
var a = ไม่ได้กำหนด;
การแจ้งเตือน (a);
กล่าวอีกนัยหนึ่งเมื่อมีการประกาศตัวแปรโดยไม่ต้องกำหนดค่า JS จะผ่านค่าที่ไม่ได้กำหนดไปยังตัวแปร โปรดทราบว่านี่คือ "ค่า" ซึ่งหมายความว่า A มีค่าอยู่แล้วและค่านี้เรียกว่า "ไม่ได้กำหนด"
ตัวแปรที่อยู่เบื้องหลังการแจ้งเตือนโดยตรงไม่เคยปรากฏขึ้นซึ่งหมายความว่านี่เป็นสิ่งที่ไม่ได้กำหนดจริง
ใส่ง่ายๆ: ไม่มีตัวแปรที่ไม่มีค่าใน JS และค่าจะถูกกำหนดเมื่อประกาศตัวแปร
จากนั้นเราดูรหัสต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
การแจ้งเตือน (a);
var a = 1;
รหัสนี้จะรายงานข้อผิดพลาดหรือไม่ เพราะเมื่อการแจ้งเตือนคือการแจ้งเตือนตัวแปร A ยังไม่ปรากฏ
แต่ไม่มีข้อผิดพลาดในลักษณะนี้ แต่ค่าที่ไม่ได้กำหนดจะปรากฏขึ้น มันบ่งชี้ว่าตัวแปร A มีอยู่แล้ว แต่ค่าไม่ใช่สิ่งที่เราต้องการ แต่ไม่ได้กำหนด ปัญหาคืออะไร?
เนื่องจากการประกาศตัวแปร VAR นั้นเหมือนกับการประกาศฟังก์ชั่นมันจะก้าวหน้าในความเป็นจริงแล้วรหัสข้างต้นจึงเป็นแบบนี้:
การคัดลอกรหัสมีดังนี้:
var a;
การแจ้งเตือน (a);
a = 1;
วิธีนี้คุณจะเข้าใจ
ดังนั้นกุญแจสำคัญของปัญหานี้คือ: การประกาศ VAR จะไปถึงจุดสูงสุดของขอบเขตล่วงหน้า แต่ค่าที่แนบมาจะไม่เป็น - การตั้งค่าที่พันกันมากฉันไม่รู้ว่าทำไมฉันถึงทำเช่นนี้ โดยส่วนตัวแล้วฉันคิดว่านี่เป็นข้อบกพร่องของ JS
ตอนนี้มีนิสัยรหัสที่ผู้สนับสนุนวางประกาศตัวแปรต่อหน้าขอบเขตอาจพิจารณาเรื่องนี้ - แม้ว่าคุณจะไม่ได้เขียนไว้ข้างหน้า JS จะดำเนินการล่วงหน้า
ตอนนี้ให้ฉันปล่อยคำตอบสำหรับคำถามที่จุดเริ่มต้นของบทความ:
การแจ้งเตือนเพียงสองครั้งเท่านั้นที่จะปรากฏขึ้นและการแจ้งเตือนหากจะไม่ถูกดำเนินการเนื่องจากการประกาศ VAR นั้นขั้นสูงรหัสจริงจะเป็นแบบนี้:
การคัดลอกรหัสมีดังนี้:
var aa;
ถ้า (! ("AA" ในหน้าต่าง)) {
แจ้งเตือน ('โอ้พระเจ้าของฉัน');
aa = 1;
-
การแจ้งเตือน ("AA" ในหน้าต่าง);
การแจ้งเตือน (AA);
แม้ว่า AA จะว่างเปล่า แต่ก็จะเป็นจริงเมื่อตัดสินโดย 'AA' ในหน้าต่างเพราะ A มีอยู่และค่าไม่ได้กำหนด ดังนั้นหากรหัสจะไม่ดำเนินการ ฉันจะไม่พูดถึงการแจ้งเตือนสองครั้งสุดท้าย
โดยส่วนตัวแล้วฉันรู้สึกว่านี่เป็นคำถามที่ไร้สาระมาก เราควรเข้าใจเหตุผลของเขา แต่ดูถูกเขาว่าเป็นกับดัก
คำถามข้างต้นก็เป็นเหตุผลว่าทำไมฉันถึงเขียนบทความนี้ ฉันเห็นรหัสนี้จากบทความออนไลน์ แต่ไม่มีคำตอบ ฉันไม่สามารถเอาชนะน้องสาวของฉันได้ดังนั้นฉันจึงไปที่ Stackoverflow และขอให้หา คำตอบคือบทความนี้
แต่นี่เป็นคำถามพื้นฐานมากจริงๆ! - -
ฮ่าฮ่ายกโทษให้ฉันมีคำถามอื่น:
การคัดลอกรหัสมีดังนี้:
var b = {}
การแจ้งเตือน (b.aa);
การแจ้งเตือน (b.aa.bb);
นี่เป็นวิธีการประกาศตัวแปร ดังนั้นรหัสนี้จะรายงานข้อผิดพลาดหรือไม่? ทำไม