Можно ли создать "слабую ссылку" в javascript?
есть ли способ в javascript создать "слабую ссылку" на другой объект? вот страница Вики, описывающая, что такое слабая ссылка.вот еще одна статья, которая описывает их в Java. может ли кто-нибудь придумать способ реализовать это поведение в javascript?
7 ответов:
в JavaScript нет языковой поддержки для weakrefs. Вы можете свернуть свой собственный, используя ручной подсчет ссылок, но не особенно гладко. Вы не можете создать объект-оболочку прокси, потому что в JavaScript объекты никогда не знают, когда они собираются собирать мусор.
таким образом, ваша "слабая ссылка" становится ключом (например. integer) в простом поиске, с помощью метода add-reference и remove-reference, и когда больше нет ссылок, отслеживаемых вручную, запись может быть удалено, оставляя будущие поиски на этом ключе, чтобы вернуть null.
Это не совсем weakref, но он может решить некоторые проблемы. Это обычно делается в сложных веб-приложениях, чтобы предотвратить утечку памяти из браузеров (обычно IE, особенно более старые версии), когда существует цикл ссылок между узлом DOM или обработчиком событий и связанным с ним объектом, таким как закрытие. В этих случаях полная схема подсчета ссылок может даже не потребоваться.
при запуске JS на NodeJS, вы можете рассмотреть https://github.com/TooTallNate/node-weak.
правда слабые ссылки, нет, еще нет (но создатели браузера смотрят на эту тему). Но вот идея о том, как имитировать слабые ссылки.
вы можете построить кэш, который вы ведете свои объекты через. Когда объект хранится, кэш сохраняет прогноз того, сколько памяти займет объект. Для некоторых элементов, таких как хранение изображений, это прямо вперед, чтобы работать. Для других это было бы сложнее.
когда вам нужен объект, то вы спросите тайник для него. Если в кэше есть объект, он возвращается. Если его там нет, то элемент создается, сохраняется, а затем возвращается.
слабые ссылки моделируются удалением элементов кэша, когда общий объем прогнозируемой памяти достигает определенного уровня. Он будет предсказывать, какие элементы наименее используются на основе того, как часто они извлекаются, взвешенные по тому, как давно они были вывезены. Стоимость "расчета" также может быть добавлена, если передается код, который создает элемент в кэш в качестве закрытия. Это позволит кэшу хранить элементы, которые очень дорого строить или генерировать.
алгоритм удаления является ключевым, потому что если вы получите это неправильно, то вы можете в конечном итоге удалить самые популярные элементы. Это вызвало бы ужасную производительность.
пока кэш является единственным объектом с постоянный ссылки на сохраненные объекты, то вышеуказанная система должна работать довольно хорошо в качестве альтернативы истинному слабому ссылки на литературу.
просто для справки; JavaScript не имеет его, но ActionScript 3 (который также является ECMAScript) делает. Проверьте параметр конструктора для словарь.
использование механизма кэширования для эмуляции слабой ссылки, как 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
http://www.jibbering.com/faq/faq_notes/closures.html
ECMAScript использует автоматическую сборку мусора. Спецификация не определяет детали, оставляя это разработчикам для сортировки, и некоторые реализации, как известно, дают очень низкий приоритет своим операциям сборки мусора. Но общая идея заключается в том, что если объект становится недоступным для ссылки (не имея оставшихся ссылок на него, доступных для выполнения кода), он становится доступным для сбора мусора и будет в какой-то момент уничтожен, а любые ресурсы, которые он потребляет, освобождаются и возвращаются в систему для повторного использования.
обычно это происходит при выходе из контекста выполнения. Структура цепочки областей, объект активации / переменной и любые объекты, созданные в контексте выполнения, включая объекты функций, больше не будут доступны и поэтому станут доступными для сборки мусора.
означает, что нет слабых только те, которые больше не появятся.
Comments