Подтвердить что ты не робот

Можно ли создать "слабую ссылку" в javascript?

Есть ли способ в javascript, чтобы создать "слабую ссылку" на другой объект? Вот вики-страница, описывающая слабую ссылку. Вот еще одна статья, которая описывает их на Java. Может кто-нибудь придумать способ реализовать это поведение в JavaScript?

4b9b3361

Ответ 1

В JavaScript нет поддержки языка для слабых сторон. Вы можете сворачивать самостоятельно, используя ручной подсчет ссылок, но не особенно гладко. Вы не можете создать объект-оболочку прокси-сервера, потому что в объектах JavaScript никогда не узнаешь, когда они собираются собирать мусор.

Таким образом, ваша "слабая ссылка" становится ключом (например, integer) в простом поиске, с помощью метода add-reference и remove-reference, а когда больше нет ссылок с отслеживанием вручную, запись может быть удалена, что исключает будущее ищет этот ключ для возврата null.

На самом деле это не является слабымref, но он может решить некоторые из тех же проблем. Обычно это делается в сложных веб-приложениях, чтобы предотвратить утечку памяти из браузеров (как правило, IE, особенно более старых версий), когда существует опорный цикл между DOM Node или обработчиком событий и связанный с ним объект, такой как закрытие. В этих случаях полная схема подсчета ссылок может даже не понадобиться.

Ответ 3

Настоящие слабые ссылки, нет, еще нет (но разработчики браузеров смотрят на эту тему). Но вот идея о том, как имитировать слабые ссылки.

Вы можете создать кеш, через который вы проезжаете свои объекты. Когда объект хранится, кеш хранит предсказание того, сколько памяти будет занимать объект. Для некоторых элементов, например, для хранения изображений, это прямо для разработки. Для других это было бы сложнее.

Когда вам нужен объект, вы затем задаете ему кеш. Если кэш имеет объект, он возвращается. Если его нет, то элемент генерируется, сохраняется, а затем возвращается.

Слабые ссылки моделируются элементами удаления кеша, когда общий объем предсказанной памяти достигает определенного уровня. Он будет прогнозировать, какие элементы используются наименее, исходя из того, как часто их извлекают, взвешивают, как давно они были вывезены. Также можно добавить стоимость "расчета", если код, который создает элемент, передается в кеш как закрытие. Это позволит кэшу сохранять элементы, которые очень дорого строить или генерировать.

Алгоритм удаления является ключевым, потому что, если вы ошибетесь, вы можете удалить наиболее популярные элементы. Это может привести к ужасной производительности.

Пока кеш является единственным объектом с постоянными ссылками на хранящиеся объекты, то вышеупомянутая система должна работать довольно хорошо, как альтернатива истинным слабым ссылкам.

Ответ 4

Просто для справки; JavaScript не имеет его, но ActionScript 3 (который также является ECMAScript). Проверьте параметр конструктора для словаря.

Ответ 5

Использование механизма кэширования для эмуляции слабой ссылки, поскольку 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

Как владелец ссылки, вы не должны делать никаких предположений о том, когда она ссылается на значение, это не отличается от кеша

Ответ 7

Обновление: сентябрь 2019 года

Пока невозможно использовать слабые ссылки, но, скорее всего, скоро это будет возможно, так как WeakRefs в JavaScript - это работа в процессе. Подробности ниже.

Предложение

Предложение теперь на стадии 3, что означает, что оно имеет полную спецификацию и что для дальнейшего усовершенствования потребуется обратная связь от реализаций и пользователей.

Предложение WeakRef включает в себя два основных новых компонента:

  • Создание слабых ссылок на объекты с помощью класса WeakRef
  • Запуск пользовательских финализаторов после того, как объекты собраны мусором, с классом FinalizationGroup

Варианты использования

Основное использование для слабых ссылок - реализация кэшей или отображений, содержащих большие объекты, когда желательно, чтобы большой объект не оставался в живых только потому, что он появляется в кэше или отображении.

Завершение - это выполнение кода для очистки после того, как объект стал недоступен для выполнения программы. Определяемые пользователем финализаторы включают несколько новых вариантов использования и могут помочь предотвратить утечки памяти при управлении ресурсами, о которых сборщик мусора не знает.

Источник и дальнейшее чтение

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

Ответ 8

EcmaScript 6 (ES Harmony) имеет объект WeakMap. Поддержка браузеров среди современных браузеров довольно хорошая (последние 3 версии Firefox, хром и даже будущая версия IE поддерживают его).

Ответ 9

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

ECMAScript использует автоматическую сборку мусора. Спецификация не определяет детали, оставляя это для разработчиков для сортировки, и некоторые реализации, как известно, дают очень низкий приоритет их операциям сбора мусора. Но общая идея заключается в том, что если объект становится невосприимчивым (оставаясь без ссылки на него оставленным доступным для выполнения кода), он становится доступным для сбора мусора и в какой-то момент времени будет уничтожен, а любые ресурсы, которые он потребляет, освобождаются и возвращаются к системе для повторного использования.

Как правило, это происходит при выходе из контекста выполнения. Структура цепочки областей, объект Activation/Variable и любые объекты, созданные в контексте выполнения, включая объекты функций, больше не будут доступны и станут доступными для сбора мусора.

Значение означает, что нет слабых только тех, которые больше не становятся доступными.