هل من الممكن لخلق "إشارة ضعيفة" في جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/266704

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة في جافا سكريبت لإنشاء "إشارة ضعيفة" إلى كائن آخر؟ هنا هو صفحة ويكي واصفا ما هي إشارة ضعيفة <لأ href = "HTTPS: // community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references "يختلط =" noreferrer "> وهنا مقال آخر أن يصف لهم في جاوة. يمكن لأي شخص أن يفكر في طريقة للتنفيذ هذا السلوك في جافا سكريبت؟

هل كانت مفيدة؟

المحلول

لا يوجد أي دعم لغة weakrefs في جافا سكريبت. يمكنك لفة بك باستخدام اليدوي إشارة العد الخاص بك، ولكن ليس وخاصة على نحو سلس. لا يمكنك جعل الكائن المجمع الوكيل، لأنه في جافا سكريبت كائنات لا نعرف متى انهم على وشك يكون بين جمع القمامة.

وهكذا الخاص بك إشارة ضعيفة "يصبح مفتاح (على سبيل المثال عدد صحيح) في بحث بسيط، مع مرجعية إضافية وطريقة إزالة المرجعية، وعندما تكون هناك أي إشارة تتبع يدويا بعد الآن ثم يمكن حذفها دخول، وترك عمليات البحث المستقبلية على هذا المفتاح للعودة لاغية.

وهذا ليس حقا weakref، ولكن يمكن حل بعض المشاكل نفسها. فإنه عادة ما يتم ذلك في تطبيقات الويب المعقدة لمنع تسرب الذاكرة من المتصفحات (عادة IE، خصوصا الإصدارات القديمة) عندما يكون هناك حلقة إشارة بين عقدة DOM أو معالج الحدث، وكائن المرتبطة به مثل الإغلاق. في هذه الحالات قد لا يكون مخطط إشارة العد الكامل حتى اللازم.

نصائح أخرى

عند تشغيل JS على NodeJS، قد تنظر https://github.com/TooTallNate/node-weak .

وصحيح إشارات ضعيفة، لا، ليس بعد (ولكن صانعي المتصفح يبحثون في هذا الموضوع). ولكن هنا هو فكرة عن كيفية محاكاة إشارات ضعيفة.

هل يمكن بناء مخبأ التي تدفع الأشياء الخاصة بك من خلال. عندما يتم تخزين كائن، ذاكرة التخزين المؤقت يحتفظ التنبؤ مقدار الذاكرة سوف تأخذ الكائن فوق. بالنسبة لبعض البنود، مثل تخزين الصور، وهذا هو على التوالي إلى الأمام للعمل بها. وبالنسبة لآخرين هذا من شأنه أن يكون أكثر صعوبة.

وعندما تحتاج كائن، وكنت ثم يطلب من مخبأ لذلك. إذا كان التخزين المؤقت لديه وجوه، فإنه يتم إرجاعها. إذا لم يكن هناك، ثم يتم إنشاء هذا البند، تخزين، ثم عاد.

يتم محاكاة إشارات ضعيفة من ذاكرة التخزين المؤقت إزالة العناصر، عندما المبلغ الإجمالي للذاكرة توقع يصل إلى مستوى معين. وسوف التنبؤ التي استخدمت الأقل على أساس العناصر على عدد المرات التي يتم جلبها، مرجحة منذ متى تم نقلهم خارج. ويمكن أيضا أن تضاف A 'الحساب' التكلفة، إذا تم تمرير التعليمات البرمجية التي تخلق هذا البند إلى ذاكرة التخزين المؤقت كما الإغلاق. وسيتيح ذلك ذاكرة التخزين المؤقت للحفاظ على البنود التي هي مكلفة جدا لبناء أو توليد.

وخوارزمية الحذف هو مفتاح الحل، لأنه إذا كنت تحصل على هذا الخطأ ثم قد ينتهي بك المطاف إزالة العناصر الأكثر شعبية. وهذا من شأنه أن يسبب أداء رهيب.

وطالما ذاكرة التخزين المؤقت هو الكائن الوحيد مع دائما ما يشير إلى الأشياء المخزنة، ثم النظام المذكور أعلاه يجب أن تعمل بشكل جيد كبديل للإشارات ضعيفة الحقيقية.

وفقط للرجوع اليها. جافا سكريبت لا يكون ذلك، ولكن أكشن 3 (والذي هو أيضا ECMAScript) لا. تحقق من ل قاموس .

وعن طريق آلية التخزين المؤقت لمضاهاة إشارة ضعيفة، كما JL235 اقترح <لأ href = "HTTPS: // ستاكوفيرفلوو كوم / أ / 7291894/1826075 "> ما سبق ، غير معقول. إذا الإشارات الضعيفة أن توجد أصلا، وكنت مراقبة سلوك مثل هذا:

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 الوئام) لديه WeakMap الكائن. دعم المتصفح بين المتصفحات الحديثة هو جيدة (والإصدارات 3 الأخيرة من فايرفوكس، كروم وحتى القادم IE النسخة دعم ذلك).

http://www.jibbering.com/faq/faq_notes/closures.html

وECMAScript يستخدم جمع القمامة التلقائي. مواصفات لا يعرف التفاصيل، وترك ذلك للمنفذين لفرز، ومعروفة بعض التطبيقات لإعطاء أولوية منخفضة جدا لعمليات جمع القمامة الخاصة بهم. ولكن الفكرة العامة هي أنه إذا أصبح كائن الامم المتحدة والذي يشير (عن طريق عدم وجود ما يشير المتبقية لأنه ترك للوصول إلى تنفيذ التعليمات البرمجية) أن تصبح متوفرة لجمع القمامة وسوف في مرحلة ما في المستقبل أن تدمر وأية موارد تستهلك تحريرها وعاد لنظام لإعادة استخدامها.

وهذا من شأنه أن يكون الحال عادة عند الإنهاء سياق التنفيذ. هيكل سلسلة نطاق، فإن تفعيل / الكائن المتغير وأي الكائنات التي تم إنشاؤها ضمن سياق التنفيذ، بما في ذلك كائنات وظيفة، لم يعد من الممكن الوصول إليها وهكذا ستصبح متاحة لجمع القمامة.

ومعنى عدم وجود الضعيفة منها فقط التي لم تعد تصبح متاحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top