1. พื้นที่หน่วยความจำใน JS แบ่งออกเป็นสองประเภท: หน่วยความจำสแต็กและหน่วยความจำกอง
หน่วยความจำสแต็ก: จัดเตรียมสภาพแวดล้อมสำหรับการดำเนินการรหัส JS; จัดเก็บค่าของชนิดข้อมูลพื้นฐาน -> ขอบเขตทั่วโลกหรือขอบเขตส่วนตัวเป็นหน่วยความจำแบบสแต็กจริง
หน่วยความจำฮีป: จัดเก็บค่าของประเภทข้อมูลอ้างอิง (วัตถุเก็บชื่อแอตทริบิวต์และค่าแอตทริบิวต์ไว้ในนั้นและฟังก์ชั่นเก็บรหัสในตัวฟังก์ชั่นเป็นสตริง)
2. เมื่อเบราว์เซอร์โหลดหน้า HTML ของเรามันจะให้สภาพแวดล้อมสำหรับการดำเนินการรหัส JS ก่อน -> ขอบเขตทั่วโลก (Global-> Window)
3. ก่อนที่จะดำเนินการรหัส JS เบราว์เซอร์จะต้องทำบางสิ่งด้วยตัวเอง: ประกาศหรือกำหนดคำหลัก VAR/ฟังก์ชั่นทั้งหมดล่วงหน้า -> "การอธิบายล่วงหน้า" (เสียงแปรผัน)
ประกาศ -> บอกเบราว์เซอร์ว่าฉันมีสิ่งนั้นเช่น var num1; ฟังก์ชั่น FN;
กำหนด -> กำหนดค่าให้กับตัวแปรหรือฟังก์ชั่นที่ประกาศเช่น NUM1 = 12; fn = function () {}
[สำคัญ] ตัวแปรเท่านั้นประกาศว่าไม่ได้กำหนดค่าเริ่มต้นจะไม่ได้กำหนด (ไม่ได้กำหนด)
4. การประมวลผลของ VAR และฟังก์ชั่นแตกต่างกันในขั้นตอนการตีความก่อน
var -> เมื่อดำเนินการก่อนการอธิบายตัวแปรจะถูกประกาศล่วงหน้า การดำเนินการที่ได้รับมอบหมายจะเสร็จสมบูรณ์เฉพาะเมื่อมีการดำเนินการรหัส
ฟังก์ชั่น -> ในระหว่างการอธิบายล่วงหน้าการประกาศและคำจำกัดความทั้งหมดจะเสร็จสมบูรณ์ล่วงหน้า (เมื่อมีการดำเนินการรหัสจะถูกข้ามโดยตรง)
[สำคัญ] ในตอนแรกมีการตีความล่วงหน้าเท่านั้นที่ดำเนินการบนหน้าต่าง สตริงปัจจุบันที่เก็บไว้ในฟังก์ชั่น FN นั้นเป็นสตริงทั้งหมดดังนั้น VAL Total จึงไม่มีความหมายในทางปฏิบัติดังนั้นการตีความล่วงหน้าจึงไม่ได้ดำเนินการ-> "การตีความล่วงหน้าเกิดขึ้นในขอบเขตปัจจุบัน"
console.log (obj); //-> undefined var obj = {ชื่อ: "จาง Shanshan", อายุ: 10}; ฟังก์ชั่น FN (NUM1, NUM2) {// ข้ามโดยตรงเมื่อรหัสถูกเรียกใช้กับบรรทัดนี้เนื่องจากในระหว่างการอธิบายล่วงหน้าเราได้เสร็จสิ้นการประกาศและคำจำกัดความ var total = num1 + num2; console.log (รวม); } var num1 = 12; FN (NUM1, 100); // ดำเนินการ FN, กำหนดค่าของตัวแปรส่วนกลาง NUM1 ให้กับพารามิเตอร์ NUM1 และกำหนด 100 ให้กับพารามิเตอร์ NUM25. ตัวแปรที่ประกาศภายใต้ขอบเขตทั่วโลกเป็นตัวแปรทั่วโลก
ตัวแปรที่ประกาศในขอบเขตส่วนตัวเป็นตัวแปรส่วนตัว พารามิเตอร์อย่างเป็นทางการของฟังก์ชั่นเป็นตัวแปรส่วนตัว
จะบอกได้อย่างไรว่าตัวแปรที่ปรากฏในฟังก์ชั่นเป็นส่วนตัวหรือทั่วโลก?
ก่อนอื่นให้ดูว่ามันเป็นพารามิเตอร์ที่เป็นทางการแล้วดูว่ามีการประกาศในขอบเขตส่วนตัวหรือไม่ (มีตัวแปร) หนึ่งในสองเป็นตัวแปรส่วนตัว จากนั้นไม่ว่ามันจะปรากฏในฟังก์ชั่นปัจจุบันมันเป็นส่วนตัวและไม่มีความสัมพันธ์ระหว่างมันกับทั่วโลก; ถ้าไม่เป็นเช่นนั้นก็หมายความว่ามันไม่ใช่ส่วนตัวให้ค้นหาขอบเขตก่อนหน้านี้ ...
6. เมื่อฟังก์ชั่นถูกเรียกใช้งานขอบเขตส่วนตัวใหม่ (หน่วยความจำสแต็ก) จะถูกสร้างขึ้นสำหรับรหัสในร่างกายฟังก์ชันเพื่อดำเนินการ;
1) กำหนดค่าให้กับพารามิเตอร์อย่างเป็นทางการ
2) การตีความล่วงหน้าภายใต้ขอบเขตส่วนตัว
3) การดำเนินการรหัสภายใต้ขอบเขตส่วนตัว
ขอบเขตส่วนตัวใหม่ที่เกิดขึ้นยังปกป้องตัวแปรส่วนตัวภายในจากอิทธิพลภายนอก เราวางกลไกการป้องกันนี้ของฟังก์ชั่น -> "การปิด
ความแตกต่าง: ผู้ที่มี VAR สามารถประกาศได้ก่อนที่จะมีการเรียกใช้รหัสในขณะที่ผู้ที่ไม่มี VAR ไม่สามารถประกาศล่วงหน้าได้
1. จำเป็นต้องมีการอธิบายล่วงหน้าไม่ว่าเงื่อนไขจะเป็นจริงหรือไม่
การอธิบายล่วงหน้าของหน้าต่าง: var a; -> window.a; if (! ("a" ในหน้าต่าง)) {// "a" ในหน้าต่าง -> true var a = "us"; } console.log (a); //-> undefined2. การตีความล่วงหน้าจะเกิดขึ้นที่ด้านซ้ายของ "=" มีเพียงด้านซ้ายเท่านั้นคือการตีความล่วงหน้าและด้านขวาคือค่าที่ไม่มีการตีความล่วงหน้า
ฟังก์ชั่นนิพจน์ของฟังก์ชั่นที่ไม่ระบุชื่อ: กำหนดส่วนของนิยามฟังก์ชันเป็นค่าให้กับเหตุการณ์ที่เป็นตัวแปรหรือองค์ประกอบ
เมื่อการอธิบายล่วงหน้า: var fn; -> ค่าเริ่มต้นของ FN ไม่ได้กำหนดไว้
fn (); //-> undefined () uncaught typeError: fn ไม่ใช่ฟังก์ชั่นฟังก์ชันเท่านั้นสามารถดำเนินการใน JS && หากรหัสด้านบนข้างต้น js ถูกรายงานรหัสด้านล่างไม่ได้ดำเนินการโดยไม่มีการประมวลผลพิเศษ var fn = function () {console.log ("ตกลง"); - fn (); เมื่อการอธิบายล่วงหน้า: fn = xxxfff000 fn (); //-> "ตกลง" ฟังก์ชั่น fn () {console.log ("ตกลง"); } fn (); //-> ฟังก์ชั่น "ตกลง" fn () {console.log ("ตกลง"); } fn (); //-> "ตกลง"3. รหัสด้านล่างการส่งคืนในร่างกายฟังก์ชั่นจะไม่ถูกดำเนินการอีกต่อไป แต่รหัสด้านล่างจำเป็นต้องเข้าร่วมในการอธิบายล่วงหน้า และสิ่งที่อยู่เบื้องหลังการส่งคืนจะต้องดำเนินการ แต่เนื่องจากมันถูกส่งคืนเป็นค่าจึงไม่ได้ทำการอธิบายล่วงหน้า
var total = 300; ฟังก์ชั่น fn () {console.log (รวม); ผลรวมฟังก์ชันส่งคืน () {}; // return คือการส่งคืนค่าในฟังก์ชันไปยังด้านนอกของฟังก์ชั่นซึ่งส่งคืนที่อยู่หน่วยความจำที่สอดคล้องกับฟังก์ชันไปยังด้านนอกของฟังก์ชันตัวอย่างเช่น: ส่งคืน xxxfff111; รหัสด้านล่างกลับมาในร่างกายฟังก์ชั่นไม่ได้ดำเนินการ var total = 10; } fn ();4. ฟังก์ชั่นของฟังก์ชั่นที่ไม่ระบุชื่อไม่ได้อธิบายไว้ล่วงหน้าภายใต้ขอบเขตทั่วโลก
ฟังก์ชั่นการดำเนินการที่ใช้ตัวเองของฟังก์ชั่นที่ไม่ระบุชื่อ: คำจำกัดความและการดำเนินการเสร็จสมบูรณ์ด้วยกัน
(ฟังก์ชั่น (num) {}) (100);
5. เมื่อมีการอธิบายล่วงหน้าหากชื่อซ้ำมันจะถูกประกาศเพียงครั้งเดียวและไม่ซ้ำ แต่การมอบหมายจะยังคงทำซ้ำ
หากชื่อของตัวแปรและชื่อของฟังก์ชั่นเหมือนกับชื่อของฟังก์ชันใน JS ก็จะถูกพิจารณาซ้ำ
การอธิบายล่วงหน้า:
var fn; ประกาศ fn = xxxffff000; [ประกาศ] อย่า + กำหนด FN = XXXFFF111; [การประกาศ] อย่า + นิยาม -> fn = xxxfff111 var fn = 12; // window.fn = 12 ฟังก์ชั่น fn () {//window.fn=function () {}} ฟังก์ชั่น fn () {}ข้างต้นคือความเข้าใจที่เกี่ยวข้องทั้งหมดเกี่ยวกับการอธิบายล่วงหน้าของ JS ที่นำมาให้คุณโดยบรรณาธิการ ฉันหวังว่าคุณจะสนับสนุน wulin.com เพิ่มเติม ~