สภาพแวดล้อมการดำเนินการกำหนดข้อมูลอื่น ๆ ที่ตัวแปรหรือฟังก์ชั่นได้รับอนุญาตให้เข้าถึงและกำหนดพฤติกรรมที่เกี่ยวข้อง แต่ละสภาพแวดล้อมการดำเนินการมีวัตถุตัวแปรที่เกี่ยวข้อง
สภาพแวดล้อมการดำเนินการทั่วโลกเป็นสภาพแวดล้อมการดำเนินการต่อพ่วงมากที่สุด ขึ้นอยู่กับสภาพแวดล้อมของโฮสต์ที่การใช้งาน JavaScript ตั้งอยู่วัตถุที่เป็นตัวแทนของสภาพแวดล้อมการดำเนินการก็แตกต่างกันเช่นกัน ในเว็บเบราว์เซอร์สภาพแวดล้อมการดำเนินการทั่วโลกถือเป็นวัตถุหน้าต่าง ดังนั้นตัวแปรและฟังก์ชั่นทั่วโลกทั้งหมดจึงถูกสร้างขึ้นเป็นคุณสมบัติและวิธีการของวัตถุหน้าต่าง
ตัวแปรวัตถุ: ตัวแปรและฟังก์ชั่นทั้งหมดที่กำหนดไว้ในสภาพแวดล้อมจะถูกเก็บไว้ในวัตถุนี้
โซ่ขอบเขต: เมื่อรหัสถูกดำเนินการในสภาพแวดล้อมจะมีการสร้างโซ่ขอบเขตของวัตถุตัวแปร จุดประสงค์ของห่วงโซ่ขอบเขตคือเพื่อให้แน่ใจว่าการเข้าถึงตัวแปรและฟังก์ชั่นทั้งหมดเป็นระเบียบที่เป็นระเบียบที่ได้รับอนุญาตให้เข้าถึงสภาพแวดล้อมการดำเนินการ ส่วนหน้าของห่วงโซ่ขอบเขตมักจะเป็นวัตถุตัวแปรในสภาพแวดล้อมที่รหัสดำเนินการในปัจจุบันอยู่
วัตถุที่ใช้งานอยู่: วัตถุที่ใช้งานอยู่มีเพียงตัวแปรเดียวที่จุดเริ่มต้นนั่นคือวัตถุอาร์กิวเมนต์ วัตถุตัวแปรถัดไปในห่วงโซ่ขอบเขตมาจากสภาพแวดล้อมการรวม (ภายนอก) และวัตถุตัวแปรถัดไปมาจากสภาพแวดล้อมการรวมครั้งต่อไป สิ่งนี้ยังคงเป็นสภาพแวดล้อมการดำเนินการทั่วโลก วัตถุตัวแปรของสภาพแวดล้อมการดำเนินการทั่วโลกมักเป็นวัตถุสุดท้ายในห่วงโซ่ขอบเขต
การแยกวิเคราะห์ตัวระบุ: การแยกวิเคราะห์ตัวระบุเป็นกระบวนการค้นหาตัวระบุทีละคนตามห่วงโซ่ขอบเขต กระบวนการค้นหาจะเริ่มต้นจากส่วนหน้าของห่วงโซ่ขอบเขตแล้วกลับไปทีละขั้นตอนจนกว่าจะพบตัวระบุ
รหัสตัวอย่าง:
var color = "blue"; function changecolor () {ถ้า (color === "blue") {color = "red"; } else {color = "blue"; }} changecolor (); การแจ้งเตือน ("สีคือตอนนี้" + สี);ห่วงโซ่ขอบเขตของฟังก์ชั่น changeColor () มีสองวัตถุ: วัตถุตัวแปรของตัวเอง (ซึ่งกำหนดวัตถุอาร์กิวเมนต์) และวัตถุตัวแปรของตัวแปรทั่วโลก สามารถเข้าถึงสีตัวแปรภายในฟังก์ชั่นเพราะสามารถพบได้ในโซ่ขอบเขตนี้
นอกจากนี้ตัวแปรที่กำหนดไว้ในขอบเขตท้องถิ่นสามารถใช้แทนกันได้กับตัวแปรทั่วโลกในสภาพแวดล้อมท้องถิ่นตัวอย่าง:
var color = "blue"; function changeColor () {var otothercolor = "สีแดง"; ฟังก์ชั่น swapColors () {var tempColor = อื่นสี; สีอื่น = สี; สี = tempColor; // คุณสามารถเข้าถึงสี, สีอื่นและ tempcolor ที่นี่} // คุณสามารถเข้าถึงสีและสีอื่นได้ที่นี่ แต่คุณไม่สามารถเข้าถึง tempcolor swapcolors ();} // คุณสามารถเข้าถึง colorchangecolor ();รหัสข้างต้นเกี่ยวข้องกับ 3 สภาพแวดล้อมการดำเนินการ: สภาพแวดล้อมทั่วโลก, สภาพแวดล้อมการจัดการของ changecolor () และสภาพแวดล้อมท้องถิ่นของ swapcolors ()
มีสีตัวแปรและฟังก์ชั่น changecolor () ในตัวแปรส่วนกลาง ตัวแปรท้องถิ่นของ changecolor () มีตัวแปรอื่นสีและฟังก์ชั่น swapcolors () ฟังก์ชันซึ่งสามารถเข้าถึงสีในตัวแปรส่วนกลาง มีตัวแปร tempcolor ในตัวแปรท้องถิ่นของ swapcolors () ใน swapcolors () คุณสามารถเข้าถึงสีในตัวแปรทั่วโลกหรือตัวแปรอื่น ๆ เพราะสภาพแวดล้อมทั้งสองนั้นเป็นสภาพแวดล้อมการดำเนินการหลัก ห่วงโซ่ขอบเขตของตัวอย่างข้างต้นคือ:
ในหมู่พวกเขา สภาพแวดล้อมภายในสามารถเข้าถึงสภาพแวดล้อมภายนอกทั้งหมดผ่านห่วงโซ่ขอบเขต แต่สภาพแวดล้อมภายนอกไม่สามารถเข้าถึงตัวแปรและฟังก์ชั่นใด ๆ ในสภาพแวดล้อมภายใน การเชื่อมต่อระหว่างตัวแปรสภาพแวดล้อมเป็นเส้นตรงและลำดับ ตัวแปรแต่ละตัวสามารถค้นหาโซ่ขอบเขตจาก Superior เพื่อสอบถามชื่อตัวแปรและชื่อฟังก์ชันนั่นคือการค้นหาตัวแปรหรือชื่อฟังก์ชันแรกในฟังก์ชันนี้และหากไม่ได้สอบถามไปยังห่วงโซ่ขอบเขตก่อนหน้านี้จนกว่าจะถึงขอบเขตด้านบน อย่างไรก็ตามไม่มีสภาพแวดล้อมใดที่สามารถค้นหาห่วงโซ่ขอบเขตและป้อนสภาพแวดล้อมการดำเนินการอื่น
พารามิเตอร์ฟังก์ชั่นยังถือว่าเป็นตัวแปรดังนั้นกฎการเข้าถึงของพวกเขาจึงเหมือนกับตัวแปรอื่น ๆ ในสภาพแวดล้อมการดำเนินการ
1. ขยายขอบเขตห่วงโซ่
ห่วงโซ่ขอบเขตจะขยายออกไปเมื่อโฟลว์การดำเนินการเข้าสู่ข้อความใด ๆ ต่อไปนี้:
•การจับบล็อกคำสั่งลองจับ
•ด้วยคำสั่ง
ข้อความทั้งสองนี้จะเพิ่มวัตถุตัวแปรที่ปลายด้านหน้าของขอบเขต
สำหรับคำสั่งด้วยคำสั่งตัวแปรที่ระบุจะถูกเพิ่มเข้าไปในห่วงโซ่ขอบเขต สำหรับคำสั่ง Catch จะสร้างวัตถุตัวแปรใหม่ซึ่งมีการประกาศของวัตถุที่ไม่ถูกต้องที่ถูกโยนทิ้ง
ตัวอย่างเช่น:
function buildurl () {var qs = "? debug = true"; ด้วย (ตำแหน่ง) {var url = href + qs; } return url;}คำสั่งด้วยได้รับวัตถุตำแหน่งดังนั้นวัตถุตัวแปรของมันจึงมีคุณสมบัติและวิธีการที่ใช้โดยวัตถุตำแหน่งและวัตถุตัวแปรนี้จะถูกเพิ่มไปที่ปลายด้านหน้าของห่วงโซ่ขอบเขต เมื่ออ้างถึงตัวแปร HREF ในคำสั่งด้วย (จริง ๆ แล้วหมายถึง location.href) มันสามารถพบได้ในตัวแปรสภาพแวดล้อมปัจจุบัน เมื่ออ้างถึงตัวแปร QS ตัวแปรที่กำหนดไว้ใน buildUrl () จะถูกอ้างอิงซึ่งอยู่ในวัตถุสภาพแวดล้อมของฟังก์ชันตัวแปร สำหรับคำสั่งด้วยคำสั่งตัวแปรที่ชื่อ URL ถูกกำหนดไว้ดังนั้น URL จึงกลายเป็นส่วนหนึ่งของสภาพแวดล้อมการดำเนินการฟังก์ชั่นและสามารถส่งคืนเป็นค่าของฟังก์ชัน
2. ไม่มีขอบเขตระดับบล็อก
ในจาวาสคริปต์วงเล็บปีกกาที่ล้อมรอบไม่มีขอบเขตของตัวเอง ดูรหัสต่อไปนี้:
ถ้า (จริง) {var color = "blue";} Alert (สี); // "สีฟ้า"ใน JavaScript การประกาศตัวแปรที่สร้างขึ้นโดยคำสั่ง IF/สำหรับเพิ่มตัวแปรในสภาพแวดล้อมการดำเนินการปัจจุบัน ตัวอย่างเช่น:
สำหรับ (var i = 0; i <10; i ++) {dosomething (i);} การแจ้งเตือน (i); // 10การรีไซเคิลขยะ
เช่นเดียวกับ Java JavaScript ยังมีกลไกการรีไซเคิลขยะอัตโนมัติ สภาพแวดล้อมการดำเนินการมีหน้าที่ในการจัดการหน่วยความจำที่ใช้ในระหว่างการดำเนินการรหัส เมื่อเขียนโปรแกรมไม่จำเป็นต้องมีปัญหาการใช้หน่วยความจำที่เกี่ยวข้อง การจัดสรรหน่วยความจำที่ต้องการและการรีไซเคิลหน่วยความจำที่ไร้ประโยชน์จะถูกนำไปใช้อย่างเต็มที่ หลักการของกลไกการรวบรวมขยะคือ: ค้นหาตัวแปรที่ไม่ได้ใช้อีกต่อไปจากนั้นจึงเพิ่มหน่วยความจำที่อยู่ ในการทำเช่นนี้ตัวเก็บขยะจะทำการดำเนินการนี้เป็นระยะในช่วงเวลาที่กำหนด (หรือเวลาการรวบรวมที่กำหนดไว้ล่วงหน้าในระหว่างการดำเนินการรหัส)
ก่อนที่จะทำการรวบรวมขยะคุณต้องพิจารณาว่าทรัพยากรนั้นไร้ประโยชน์และตัวแปรทำเครื่องหมายที่ไม่ได้ใช้เพื่อรีไซเคิลหน่วยความจำในอนาคตหรือไม่ โดยปกติจะมีการใช้กลยุทธ์สองประการสำหรับการระบุตัวแปรที่ไร้ประโยชน์
1 Mark Clear
วิธีที่พบบ่อยที่สุดในการรวบรวมขยะใน JavaScript คือการทำความสะอาดเครื่องหมาย เมื่อตัวแปรเข้าสู่สภาพแวดล้อมมันจะถูกทำเครื่องหมายว่า "ป้อนสภาพแวดล้อม"; เมื่อตัวแปรออกจากสภาพแวดล้อมมันจะถูกทำเครื่องหมายว่า "ออกจากสภาพแวดล้อม" เมื่อตัวเก็บขยะทำงานมันจะทำเครื่องหมายตัวแปรทั้งหมดที่ใช้ จากนั้นจะลบแท็กของตัวแปรในสภาพแวดล้อมและตัวแปรที่อ้างอิงโดยตัวแปรในสภาพแวดล้อม หลังจากนั้นตัวแปรที่ติดแท็กจะถูกมองว่าเป็นตัวแปรพร้อมที่จะลบ ในที่สุดตัวเก็บขยะให้เสร็จสิ้นการล้างหน่วยความจำทำลายค่าที่ทำเครื่องหมายไว้และรีไซเคิลพื้นที่หน่วยความจำที่พวกเขาครอบครอง
2. จำนวนการอ้างอิง
การนับจำนวนอ้างอิงหมายถึงจำนวนครั้งที่แต่ละค่ามีการอ้างอิง เมื่อมีการประกาศตัวแปรและค่าประเภทการอ้างอิงถูกกำหนดให้กับตัวแปรจำนวนการอ้างอิงถึงค่านี้คือ 1 ถ้าค่าเดียวกันถูกกำหนดให้กับตัวแปรอื่นจำนวนการอ้างอิงถึงค่าจะเพิ่มขึ้น 1. พื้นที่หน่วยความจำสามารถเรียกคืนได้ ในครั้งต่อไปที่ตัวเก็บขยะจะทำงานมันจะรีไซเคิลหน่วยความจำที่ถูกครอบครองโดยค่าเหล่านี้ด้วยการอ้างอิงเป็นศูนย์
ปัญหาหนึ่งที่การนับอ้างอิงอาจทำให้เกิดการอ้างอิงรีไซเคิล ตัวอย่างเช่น:
ปัญหาฟังก์ชั่น () {var obja = วัตถุใหม่ (); var objb = วัตถุใหม่ (); obja.someotherobj = objb; objb.someotherobj = obja;}ในตัวอย่างข้างต้น OBJA และ OBJB อ้างถึงกันและกันผ่านคุณลักษณะ หลังจากการดำเนินการฟังก์ชั่นเสร็จสิ้น OBJA และ OBJB จะยังคงมีอยู่และจำนวนการอ้างอิงของพวกเขาจะไม่เป็น 0 สถานการณ์นี้จะทำให้หน่วยความจำที่ถูกครอบครองโดย OBJA และ OBJB ที่จะนำกลับมาใช้ใหม่
บทความข้างต้นพูดสั้น ๆ เกี่ยวกับ JavaScript: สภาพแวดล้อมการดำเนินการการรวบรวมขอบเขตและขยะเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น