জাভাস্ক্রিপ্টে একটি "দুর্বল রেফারেন্স" তৈরি করা সম্ভব?


98

জাভাস্ক্রিপ্টে অন্য কোনও জিনিসের "দুর্বল রেফারেন্স" তৈরির কোনও উপায় আছে কি? দুর্বল রেফারেন্স কী তা বর্ণনা করার জন্য এখানে উইকি পৃষ্ঠাটি রয়েছে। এখানে জাভাতে তাদের বর্ণনা করে এমন আরও একটি নিবন্ধ দেওয়া আছে। জাভাস্ক্রিপ্টে এই আচরণ বাস্তবায়নের কোনও উপায় কি কেউ ভাবতে পারেন?


4
ES6 এর জন্য দুর্বল রেফারেন্সগুলি নিয়ে আলোচনা করা হচ্ছে। আপনার চোখ peeled রাখা.
রায়ান স্মিথ

4
* Wiki.ecmascript.org/doku.php?id=strawman:weak_refs- এ অফিসিয়াল স্পেস উইকি / আলোচনা , বর্তমানে “শেষ বার সংশোধিত: 2013/02/02 22:25” * এসডিসকস.আর. / টপিক / কি আরও কিছু সুনির্দিষ্ট আলোচনা -অনু-দুর্বল-রেফারেন্সগুলির স্থিতি , বর্তমানে সর্বশেষ পোস্ট "সান মার্চ 3 11:56:05 পিএসটি 2013"
ডেসটিনি আর্কিটেক্ট

অধিকাংশ ক্ষেত্রে WRs সমাধানের জন্য একটি প্রয়াশ অতিপন্ন লিসেনার সমস্যা [: এখানে আলোচনা, stackoverflow.com/questions/43758217/... । যদি এই প্রশ্নের উত্তরের উত্তর থাকে তবে আমি মনে করি না যে ডাব্লুআরএসের খুব বেশি প্রয়োজন হবে।
জেমস

@ সুপের্যাট আমি বিযুক্ত শ্রোতাদের প্রশ্নের উত্তর পোস্ট করেছি ।
জেমস

উত্তর:


39

জাভাস্ক্রিপ্টে দুর্বলতার জন্য কোনও ভাষা সমর্থন নেই। আপনি ম্যানুয়াল রেফারেন্স গণনা ব্যবহার করে নিজের রোল করতে পারেন, তবে বিশেষত মসৃণ নয়। আপনি একটি প্রক্সি মোড়ক বস্তু তৈরি করতে পারবেন না, কারণ জাভাস্ক্রিপ্টে কখনই জঞ্জাল সংগ্রহ করা হবে তা অবজেক্টগুলিতে জানতে পারে না।

সুতরাং আপনার 'দুর্বল রেফারেন্স' একটি অ্যাড-রেফারেন্স এবং অপসারণ-রেফারেন্স পদ্ধতি সহ একটি সাধারণ অনুসন্ধানে একটি কী (উদাহরণস্বরূপ পূর্ণসংখ্যার) হয়ে ওঠে এবং যখন ম্যানুয়ালি ট্র্যাক করা কোনও রেফারেন্স নেই তখন এন্ট্রি মুছে ফেলা যেতে পারে, ভবিষ্যতের চেহারাগুলি রেখে যাবে নাল ফিরে যে চাবি।

এটি সত্যই দুর্বল নয়, তবে এটি একই সমস্যাগুলির কিছু সমাধান করতে পারে। কোনও ডিওএম নোড বা ইভেন্ট হ্যান্ডলারের মধ্যে যখন কোনও রেফারেন্স লুপ থাকে এবং এর সাথে সম্পর্কিত কোনও অবজেক্ট যেমন ক্লোজার হয় তখন ব্রাউজারগুলি থেকে মেমরি ফাঁস রোধ করার জন্য এটি সাধারণত জটিল ওয়েব অ্যাপ্লিকেশনগুলিতে করা হয় (সাধারণত আই, বিশেষত পুরানো সংস্করণগুলি)। এই ক্ষেত্রে একটি সম্পূর্ণ রেফারেন্স-কাউন্টিং স্কিম এমনকি প্রয়োজন নাও হতে পারে।


4
আমি কোডটি যত্ন সহকারে পরীক্ষা করে নিই (বা ব্যবহৃত) না, তবে এস-ল্যাব-তে একটি স্ক্রিপ্ট রয়েছে যা বেসিক উইকম্যাপ এমুলেশন সরবরাহ করেঅরোরা 6 (মজিলা) এর একটি মানহীন WeakMap বাস্তবায়ন রয়েছে
theazureshadow

4
ES6 এর সাথে এই উত্তরটি আর সঠিক নয়। নীচের আমার উত্তর দেখার stackoverflow.com/a/28567560/745190
thelastshadow

9
এটি এখনও সঠিক, কারণ ES6 WeakMaps সত্যিকারের দুর্বল উল্লেখ নয়। WeakMaps কেবল কী হিসাবে বস্তু গ্রহণ করে এবং এই বস্তুর উল্লেখ দুর্বলভাবে রাখা হয়। দেখুন stackoverflow.com/questions/32397729/...
CodeManX

আমি একটি দুর্বল মানচিত্র অনুকরণ করতে একটি ক্লাস লিখেছিলাম এবং এটি এখানে পোস্ট করেছি: stackoverflow.com/a/47017206/491553
রায়ান শিলিংটন


11

আপডেট: সেপ্টেম্বর 2019

দুর্বল রেফারেন্সগুলি এখনও ব্যবহার করা সম্ভব নয় তবে খুব সম্ভবত শীঘ্রই উইকআরফ হিসাবে এটি সম্ভব হবে জাভাস্ক্রিপ্টে থাকা ওয়ার্ক ইন প্রগ্রেস। নিচে বিস্তারিত.

প্রস্তাব

এখন পর্যায় 3 এ প্রস্তাব যার অর্থ এটির সম্পূর্ণ স্পেসিফিকেশন রয়েছে এবং আরও পরিমার্জনে বাস্তবায়ন এবং ব্যবহারকারীদের কাছ থেকে প্রতিক্রিয়া প্রয়োজন।

WeakRef প্রস্তাব কার্যকারিতা দুই প্রধান নতুন টুকরা বোঝায়:

  • WeakRef বর্গ দিয়ে অবজেক্টের প্রতি দুর্বল উল্লেখ তৈরি করা
  • চূড়ান্তকরণগ্রুপ শ্রেণীর সাথে অবজেক্টগুলি আবর্জনা-সংগ্রহের পরে ব্যবহারকারীর সংজ্ঞায়িত চূড়ান্তকরণকারীগুলি চালানো

ব্যবহারের ক্ষেত্রে

একটি প্রাথমিক ব্যবহার দুর্বল রেফারেন্সের জন্য ক্যাশে বা ম্যাপিং বৃহৎ বস্তু অধিষ্ঠিত, যেখানে এটি কাঙ্ক্ষিত যে একটি বৃহৎ বস্তু একমাত্র জীবিত কারণ এটি একটি ক্যাশে বা ম্যাপিং প্রদর্শিত রাখা হয় না বাস্তবায়ন হয়।

চূড়ান্তকরণ হ'ল প্রোগ্রামের প্রয়োগে অ্যাক্সেসযোগ্য হয়ে যাওয়া কোনও বস্তুর পরে সাফ করার জন্য কোড কার্যকর করা execution ব্যবহারকারী-সংজ্ঞায়িত চূড়ান্তকরণগুলি বেশ কয়েকটি নতুন ব্যবহারের কেস সক্ষম করে এবং আবর্জনা সংগ্রহকারী জানেন না এমন সংস্থানগুলি পরিচালনা করার সময় মেমরি ফাঁস রোধে সহায়তা করতে পারে।

উত্স এবং আরও পড়া

https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references


4
ফায়ারফক্স নাইট উইকারফের জন্য পরীক্ষামূলক সমর্থন যুক্ত করেছে। উইকসেটের পুনরাবৃত্তিযোগ্য সংস্করণটি তৈরি করতে এটি ব্যবহার করে একটি উদাহরণ প্রয়োগ করা হচ্ছে: gist.github.com/seanlinsley/bc10378fd311d75cf6b5e80394be813d
সানলিনসলে

3

সত্য দুর্বল তথ্যসূত্র, না, এখনও নয় (তবে ব্রাউজার নির্মাতারা বিষয়টির দিকে তাকাচ্ছেন)। তবে এখানে দুর্বল রেফারেন্সগুলি কীভাবে অনুকরণ করা যায় সে সম্পর্কে একটি ধারণা।

আপনি একটি ক্যাশে তৈরি করতে পারেন যার মাধ্যমে আপনি আপনার অবজেক্টগুলিকে চালিত করে। যখন কোনও বস্তু সংরক্ষণ করা হয়, তখন ক্যাচটি কী পরিমাণ স্মৃতি গ্রহণ করবে তার পূর্বাভাস রাখে। চিত্র সংরক্ষণের মতো কিছু আইটেমের জন্য এটি সরাসরি কাজ করার জন্য এগিয়ে is অন্যদের জন্য এটি আরও কঠিন হবে।

যখন আপনার কোনও জিনিসের প্রয়োজন হয়, আপনি তার জন্য এর জন্য ক্যাশে জিজ্ঞাসা করুন। যদি ক্যাশে অবজেক্ট থাকে তবে তা ফিরিয়ে দেওয়া হয়। যদি এটি না থাকে, তবে আইটেমটি উত্পন্ন, সঞ্চয় করা এবং তারপরে ফিরে আসে returned

ভবিষ্যদ্বাণী করা মেমরির একটি নির্দিষ্ট পরিমাণ একটি নির্দিষ্ট স্তরে পৌঁছায়, দুর্বল উল্লেখগুলি ক্যাশে অপসারণ আইটেমগুলির দ্বারা অনুকরণ করা হয়। এটি পূর্বাভাস দেবে যে কোন আইটেমগুলি প্রায়শই পুনরুদ্ধার করা হয় তার ভিত্তিতে কমপক্ষে ব্যবহৃত হয়, কতক্ষণ আগে সেগুলি নেওয়া হয়েছিল তার দ্বারা ভারিত। আইটেমটি তৈরি করে এমন কোডটি বন্ধ হিসাবে ক্যাশে প্রেরণ করা হলে একটি 'গণনা' ব্যয়ও যুক্ত করা যেতে পারে। এটি ক্যাশে আইটেমগুলি রাখার অনুমতি দেয় যা খুব ব্যয়বহুল তৈরি বা জেনারেট করে।

মোছার অ্যালগরিদম কী, কারণ আপনি যদি এই ভুলটি পান তবে আপনি সর্বাধিক জনপ্রিয় আইটেমগুলি সরিয়ে ফেলতে পারেন। এটি ভয়ানক পারফরম্যান্সের কারণ হবে।

যতক্ষণ না ক্যাশে সঞ্চিত অবজেক্টগুলির স্থায়ী রেফারেন্স সহ একমাত্র অবজেক্ট থাকে , ততক্ষণ উপরের সিস্টেমটি সত্য দুর্বল রেফারেন্সের বিকল্প হিসাবে বেশ সুন্দরভাবে কাজ করা উচিত।


25
আপনি যা বলেছেন তার বেশিরভাগটিই দুর্বলতার পক্ষে অপ্রাসঙ্গিক নয়?
এরিক কাপলুন

22
@ জেএল 235 - দুর্বল উল্লেখগুলির জন্য গুরুত্বপূর্ণ ব্যবহারটি ক্যাশে নয়, ইভেন্ট হ্যান্ডলারের পক্ষে lers আমার কিছু আপত্তি রয়েছে যে এটি বিদ্যমান থাকাকালীন অন্য কিছু ঘটনা পালন করা উচিত - তবে আমি এই বিষয়টি চাই না যে এটি কোনও নোটিফিকেশন-তালিকায় রয়েছে জিসির উদ্দেশ্যগুলির জন্য একটি রেফারেন্স গঠন করবে।
মালভোলিও

7
দুর্বল উল্লেখগুলি ক্যাচিংয়ের সাথে কিছুই করার নয়। একটি দুর্বল রেফারেন্স মানে আপনি কোনও কিছুর উপর নজর রাখতে চান, তবে যদি অবজেক্টটির ট্র্যাকিংয়ের কোনও অবশিষ্ট রেফারেন্স না থাকে তবে আপনি এটিকে মোছার অনুমতি দিন।
ফাবস্প্রো

8
স্বয়ংক্রিয়ভাবে মেয়াদোত্তীর্ণ হওয়ার জন্য দুর্বল রেফারেন্স ব্যবহার করে ক্যাশে তৈরির ক্ষেত্রে স্পষ্টভাবে ব্যবহারের কেস রয়েছে।
ফিল ফ্রিম্যান

4
প্রচলিতভাবে দুর্বল উল্লেখগুলির জন্য শীর্ষস্থানীয় কারণ হ'ল ক্যাচিং। ইভেন্ট হ্যান্ডলার ডিওএম জিনিসটি কেবলমাত্র কয়েকটি এক্সপ্লোরার বগি জিনিস।
axkibe


2

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

রেফারেন্সের ধারক হিসাবে এটি কখন কোনও মান বোঝায় সে সম্পর্কে আপনার কোনও অনুমান করা উচিত নয়, এটি ক্যাশে ব্যবহার করে আলাদা নয়



-4

ইকামাস্ক্রিপ্ট 6 (ইএস হারমনি) এর একটি উইকম্যাপ অবজেক্ট রয়েছে। আধুনিক ব্রাউজারগুলির মধ্যে ব্রাউজার সমর্থন বেশ ভাল (ফায়ারফক্সের শেষ 3 সংস্করণ, ক্রোম এবং এমনকি একটি আসন্ন আইই সংস্করণ এটি সমর্থন করে)।


29
এটি ঠিক এক রকম নয়। একজন WeakMapতা না হয় objects-- দুর্বল রেফারেন্স দেয় না মান যে WeakMap মধ্যে দুর্বল রেফারেন্স আছে, কিন্তু কী । মানচিত্রে দুর্বল উল্লেখগুলি কেবলমাত্র একটি মেমরি ফাঁস প্রতিরোধ ব্যবস্থা, এবং অন্যথায় এটি ব্যবহারকারীর কাছে পর্যবেক্ষণযোগ্য নয় fact
EyasSH

4
আপনি সঠিক যে এটি কীগুলি দুর্বল, মানগুলি নয়। তবে দুর্বল রেফারেন্স ব্যবহারের পুরো উদ্দেশ্যটি হ'ল রেফারেন্সযুক্ত জিনিসটি আবর্জনা সংগ্রহের অনুমতি দেওয়া। ওপি দুটি লিঙ্ক পোস্ট করেছে যার মধ্যে দ্বিতীয়টি হল এমন কোনও আইডিকে আইডি যুক্ত করা যা আপনি প্রসারিত করতে পারবেন না এবং বাস্তবে এটি জাভাস্ক্রিপ্টের উইকম্যাপের জাভা সমতুল্য ওয়েকহ্যাশম্যাপ ব্যবহার করার পরামর্শ দেয়।
থ্যালাস্যাডশো

12
সৌভাগ্য WeakMap ব্যবহার যেহেতু একটি দুর্বল রেফারেন্স বাস্তবায়ন weakmap.get(new String('any possible key that has ever existed or ever will exist'))হবে সবসময় হতে undefined। দরকারী নয় । ডাউন-ভোটিং!
ব্যবহারকারী 3338098

-5

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

ইসমাস্ক্রিপ্ট স্বয়ংক্রিয় আবর্জনা সংগ্রহ ব্যবহার করে। স্পেসিফিকেশন বিশদটি সংজ্ঞায়িত করে না, যা প্রয়োগকারীদের বাছাইয়ের জন্য ছেড়ে যায় এবং কিছু বাস্তবায়ন তাদের আবর্জনা সংগ্রহের ক্রিয়াকলাপকে খুব কম অগ্রাধিকার দেয়। তবে সাধারণ ধারণাটি হ'ল যদি কোনও বস্তু অপরিবর্তনীয় হয়ে যায় (এর সাথে কোনও রেফারেন্সের সাথে বাকী কোনও রেফারেন্স না দিয়ে মৃত্যুদন্ড কার্যকর করা যায়) এটি আবর্জনা সংগ্রহের জন্য উপলব্ধ হয়ে যায় এবং ভবিষ্যতের কোনও মুহুর্তে ধ্বংস হয়ে যায় এবং যে সমস্ত উত্স সেগুলি খালাস করে ফিরে আসে পুনরায় ব্যবহারের জন্য সিস্টেমে।

মৃত্যুদন্ড কার্যকর করার প্রসঙ্গটি থেকে বেরিয়ে আসার পরে এটি সাধারণত ঘটে। স্কোপ চেইন স্ট্রাকচার, অ্যাক্টিভেশন / ভেরিয়েবল অবজেক্ট এবং ফাংশন অবজেক্টস সহ নির্বাহের প্রেক্ষাপটে তৈরি হওয়া যে কোনও অবজেক্টগুলি আর অ্যাক্সেসযোগ্য হবে না এবং তাই আবর্জনা সংগ্রহের জন্য উপলব্ধ হয়ে উঠবে।

মানে এমন কোনও দুর্বল কেবল নেই যা আর উপলব্ধ হয় না।


10
রেফারেন্স চক্র এড়ানো কেবল দুর্বল রেফারেন্স ব্যবহার করার কারণ নয়। তারা অবজেক্ট ইনস্ট্যান্স পুলিং / ক্যাশিং ইত্যাদির জন্য খুব কার্যকরী।
ফ্লফি

WeakReferences সংজ্ঞা একটি প্রশ্ন নয়। উপরের মতামত সহ একমত।
ইউরি ইয়ারিশেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.