Думаю, вы неправильно понимаете, как работает GC. Использование слабой ссылки не определит myObject
. Это может (возможно, не обязательно) предотвратить область, в которой обработчик объявлен для сбора (пока жив myObject
). Следовательно, сам обратный вызов может быть собран, в результате чего он не будет выполнен. Похоже, это тот случай, согласно вашему описанию.
Таким образом, ваша цель состоит в том, чтобы избежать сбора декларации someFunction
. Одним из способов может быть использование жесткого рефери (если вы спросите меня, в любом случае слабые реферы - плохая идея). Могут быть и другие, но я не знаю, как структурировано ваше приложение, поэтому не могу сказать много.
Изменить для адреса комментария.
GC мудро, обработка событий не отличается от общего случая. Когда вы добавляете прослушиватель, вы передаете ссылку диспетчеру (ссылка - это область, в которой объявлен прослушиватель). В диспетчере хранится эта ссылка, чтобы при необходимости он мог выполнить обратный вызов. Это действительно не так уж отличается от этого:
myObject.keepThisReference = someFunction;
Теперь myObejct
имеет ссылку на someFunction
. Таким образом, пока myObject
жив, someFunction
также будет жив (если вы не установите someFunction
в качестве слабого реф).
Итак, чтобы ответить на вопрос в вашем комментарии (объект не упоминается где-либо еще, но к нему прикреплен прослушиватель событий), учитывая этот сценарий:
myObject.addEventListener('someEvent',someFunction);
Если myObject
не имеет никакой другой ссылки и выходит за рамки, то может быть для сбора.