มีวิธีใดบ้างในจาวาสคริปต์ในการสร้าง "การอ้างอิงที่อ่อนแอ" ไปยังวัตถุอื่น นี่คือหน้าวิกิที่อธิบายว่าการอ้างอิงที่ไม่เหมาะสมคืออะไร นี่คือบทความอื่นที่อธิบายถึงสิ่งเหล่านี้ใน Java ใครสามารถคิดวิธีการนำพฤติกรรมนี้ไปใช้ในจาวาสคริปต์ได้หรือไม่?
มีวิธีใดบ้างในจาวาสคริปต์ในการสร้าง "การอ้างอิงที่อ่อนแอ" ไปยังวัตถุอื่น นี่คือหน้าวิกิที่อธิบายว่าการอ้างอิงที่ไม่เหมาะสมคืออะไร นี่คือบทความอื่นที่อธิบายถึงสิ่งเหล่านี้ใน Java ใครสามารถคิดวิธีการนำพฤติกรรมนี้ไปใช้ในจาวาสคริปต์ได้หรือไม่?
คำตอบ:
ไม่มีการรองรับภาษาสำหรับจุดอ่อนใน JavaScript คุณสามารถหมุนของคุณเองโดยใช้การนับอ้างอิงด้วยตนเอง แต่ไม่ราบรื่นเป็นพิเศษ คุณไม่สามารถสร้างวัตถุห่อหุ้มพร็อกซีได้เนื่องจากในวัตถุ JavaScript ไม่มีทางรู้ว่าเมื่อใดที่พวกเขากำลังจะถูกรวบรวมขยะ
ดังนั้น 'การอ้างอิงที่ไม่เหมาะสม' ของคุณจึงกลายเป็นกุญแจสำคัญ (เช่นจำนวนเต็ม) ในการค้นหาอย่างง่ายโดยใช้วิธีการอ้างอิงเพิ่มเติมและการลบการอ้างอิงและเมื่อไม่มีการอ้างอิงที่ติดตามด้วยตนเองอีกต่อไปรายการจะถูกลบทิ้งโดยปล่อยให้มีการค้นหาในอนาคต คีย์นั้นเพื่อคืนค่าว่าง
นี่ไม่ใช่จุดอ่อน แต่สามารถแก้ปัญหาเดียวกันได้ โดยทั่วไปจะทำในเว็บแอปพลิเคชันที่ซับซ้อนเพื่อป้องกันการรั่วไหลของหน่วยความจำจากเบราว์เซอร์ (โดยทั่วไปคือ IE โดยเฉพาะรุ่นเก่ากว่า) เมื่อมีการวนรอบอ้างอิงระหว่างโหนด DOM หรือตัวจัดการเหตุการณ์และวัตถุที่เกี่ยวข้องเช่นการปิด ในกรณีเหล่านี้อาจไม่จำเป็นต้องใช้รูปแบบการนับอ้างอิงแบบเต็ม
ยังไม่สามารถใช้การอ้างอิงที่อ่อนแอได้ แต่ส่วนใหญ่แล้วจะเป็นไปได้ในไม่ช้าเนื่องจากWeakRefsใน JavaScript กำลังดำเนินการอยู่ รายละเอียดด้านล่าง.
ข้อเสนออยู่ในขั้นตอนที่ 3ซึ่งหมายความว่ามีคุณสมบัติครบถ้วนและการปรับแต่งเพิ่มเติมจะต้องได้รับการตอบรับจากการใช้งานและผู้ใช้
WeakRefข้อเสนอครอบคลุมสองชิ้นใหม่ที่สำคัญของการทำงาน:
การใช้งานหลักสำหรับการอ้างอิงที่อ่อนแอคือการใช้แคชหรือการแมปที่ถือวัตถุขนาดใหญ่ซึ่งต้องการให้วัตถุขนาดใหญ่ไม่คงอยู่เพียงเพราะมันปรากฏในแคชหรือการแมป
Finalizationคือการเรียกใช้โค้ดเพื่อล้างข้อมูลหลังจากอ็อบเจ็กต์ที่ไม่สามารถเข้าถึงได้เพื่อเรียกใช้งานโปรแกรม โปรแกรมปิดท้ายที่ผู้ใช้กำหนดจะเปิดใช้งานกรณีการใช้งานใหม่ ๆ และสามารถช่วยป้องกันการรั่วไหลของหน่วยความจำเมื่อจัดการทรัพยากรที่ตัวรวบรวมขยะไม่ทราบ
https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references
การอ้างอิงที่อ่อนแออย่างแท้จริงยังไม่มี (แต่ผู้ผลิตเบราว์เซอร์กำลังดูเรื่องนี้) แต่นี่คือแนวคิดเกี่ยวกับวิธีจำลองการอ้างอิงที่อ่อนแอ
คุณสามารถสร้างแคชที่คุณขับเคลื่อนวัตถุของคุณผ่าน เมื่อวัตถุถูกเก็บไว้แคชจะคอยคาดเดาว่าวัตถุจะใช้หน่วยความจำเท่าใด สำหรับบางรายการเช่นการจัดเก็บภาพการดำเนินการนี้ตรงไปตรงมา สำหรับคนอื่นสิ่งนี้จะยากกว่า
เมื่อคุณต้องการวัตถุคุณก็ขอให้แคชมัน หากแคชมีอ็อบเจ็กต์จะถูกส่งคืน หากไม่มีรายการนั้นจะถูกสร้างขึ้นจัดเก็บแล้วส่งคืน
การอ้างอิงที่อ่อนแอถูกจำลองโดยรายการลบแคชเมื่อจำนวนหน่วยความจำที่คาดการณ์ไว้ทั้งหมดถึงระดับหนึ่ง จะทำนายว่ารายการใดถูกใช้น้อยที่สุดโดยพิจารณาจากความถี่ในการดึงข้อมูลโดยให้น้ำหนักตามระยะเวลาที่นำออกไป นอกจากนี้ยังสามารถเพิ่มต้นทุน 'การคำนวณ' ได้หากรหัสที่สร้างรายการถูกส่งไปยังแคชเป็นการปิด สิ่งนี้จะช่วยให้แคชสามารถเก็บรายการที่มีราคาแพงมากในการสร้างหรือสร้าง
อัลกอริทึมการลบเป็นกุญแจสำคัญเพราะถ้าคุณทำผิดคุณอาจต้องลบรายการยอดนิยมออกไป ซึ่งจะทำให้ประสิทธิภาพแย่มาก
ตราบใดที่แคชเป็นวัตถุเดียวที่มีการอ้างอิงถาวรไปยังอ็อบเจ็กต์ที่จัดเก็บดังนั้นระบบข้างต้นควรทำงานได้ดีเป็นทางเลือกสำหรับการอ้างอิงที่อ่อนแอจริง
เพียงเพื่อการอ้างอิง; JavaScript ไม่มี แต่ ActionScript 3 (ซึ่งก็คือ ECMAScript) ทำ ตรวจสอบพารามิเตอร์คอนสตรัคหา Dictionary
การใช้กลไกการแคชเพื่อเลียนแบบการอ้างอิงที่อ่อนแอตามที่JL235แนะนำไว้ข้างต้นนั้นสมเหตุสมผล หากมีการอ้างอิงที่อ่อนแอโดยกำเนิดคุณจะสังเกตเห็นพฤติกรรมเช่นนี้:
this.val = {};
this.ref = new WeakReference(this.val);
...
this.ref.get(); // always returns val
...
this.val = null; // no more references
...
this.ref.get(); // may still return val, depending on already gc'd or not
ในขณะที่คุณจะสังเกตเห็นแคช:
this.val = {};
this.key = cache.put(this.val);
...
cache.get(this.key); // returns val, until evicted by other cache puts
...
this.val = null; // no more references
...
cache.get(this.key); // returns val, until evicted by other cache puts
ในฐานะผู้ถือข้อมูลอ้างอิงคุณไม่ควรตั้งสมมติฐานใด ๆ เกี่ยวกับเวลาที่อ้างอิงถึงค่าซึ่งไม่ต่างจากการใช้แคช
ในที่สุดพวกเขาก็มาถึงที่นี่ ยังไม่มีการใช้งานในเบราว์เซอร์ แต่จะเป็นในเร็ว ๆ นี้
EcmaScript 6 (ES Harmony) มีวัตถุWeakMap การรองรับเบราว์เซอร์ในเบราว์เซอร์สมัยใหม่นั้นค่อนข้างดี (Firefox, chrome และเวอร์ชัน IE ที่กำลังจะมาถึง 3 เวอร์ชันล่าสุดก็รองรับ)
WeakMap
ไม่ให้อ้างอิงอ่อนแอ objects-- มันไม่ได้เป็นค่าที่มีการอ้างอิงที่อ่อนแอใน WeakMap แต่กุญแจ ความจริงที่ว่าการอ้างอิงที่อ่อนแอมีอยู่ในแผนที่เป็นเพียงกลไกการป้องกันการรั่วไหลของหน่วยความจำและผู้ใช้ไม่สามารถสังเกตเห็นได้
weakmap.get(new String('any possible key that has ever existed or ever will exist'))
จะเป็นเช่นนั้น เสมอ ไม่มีประโยชน์. ลงคะแนน! undefined
http://www.jibbering.com/faq/faq_notes/closures.html
ECMAScript ใช้การรวบรวมขยะอัตโนมัติ ข้อกำหนดไม่ได้กำหนดรายละเอียดปล่อยให้ผู้ใช้งานต้องคัดแยกและการนำไปใช้งานบางอย่างเป็นที่ทราบกันดีว่ามีลำดับความสำคัญต่ำมากสำหรับการดำเนินการรวบรวมขยะ แต่แนวคิดทั่วไปก็คือหากวัตถุไม่สามารถอ้างอิงได้ (โดยไม่มีการอ้างอิงที่เหลืออยู่ที่เหลืออยู่เพื่อให้สามารถเรียกใช้โค้ดได้) มันจะพร้อมใช้งานสำหรับการรวบรวมขยะและในอนาคตบางจุดจะถูกทำลายและทรัพยากรใด ๆ ที่ถูกใช้อย่างอิสระและถูกส่งคืน ไปยังระบบเพื่อนำกลับมาใช้ใหม่
โดยปกติจะเป็นกรณีนี้เมื่อออกจากบริบทการดำเนินการ โครงสร้างห่วงโซ่ขอบเขตอ็อบเจ็กต์การเปิดใช้งาน / ตัวแปรและอ็อบเจ็กต์ใด ๆ ที่สร้างขึ้นภายในบริบทการดำเนินการรวมถึงอ็อบเจ็กต์ฟังก์ชันจะไม่สามารถเข้าถึงได้อีกต่อไปและจะพร้อมใช้งานสำหรับการรวบรวมขยะ
ความหมายไม่มีคนอ่อนแอเท่านั้นที่ไม่มีอีกต่อไป