"1) Сколько экземпляров анонимной функции создано в памяти?"
Какая анонимная функция?
Для встроенного onclick
вы получаете функцию, назначенную свойству onclick
элемента, например:
function(event) {
bindTheClickevent();
}
... или подобное в зависимости от реализации.Эта функция будет свободна для GC, когда элемент разыменовывается или функция разыменовывается из свойства onclick
.
В отношении кода jQuery:
$(".btn").bind('click',function () {
$(this).css('color','red');
});
... whileанонимная функция является общей, но вы не видите, что если рассматриваемые элементы еще не имеют привязанного обработчика jQuery, jQuery внутренне создаст уникальную функцию для каждого элемента.
Этот внутренний обработчик - это то, что на самом деле связывается с элементом, и когда элемент получает событие, этот обработчик вызывается, анализирует событие и вызывает обработчик, который вы изначально передали (еслинеобходимо).
Это означает, что 100 jQuery-связанных элементов равно 101 уникальному экземпляру функции .
Чтобы убедиться, что все обработчики, связанные с использованием jQuery, являются GC'd, вам необходимо убедиться, что вы всегда используете jQuery для удаления элементов DOM .Если вы этого не сделаете, все данные (включая обработчики), хранящиеся в jQuery.cache
, не будут очищены, и поэтому на них всегда будут ссылаться через глобальное пространство имен jQuery
.
РЕДАКТИРОВАТЬ:
Учитывая, что есть 100
элементы, имеющие класс btn
, которые не имеют никаких обработчиков, связанных с jQuery, тогда этот код:
$(".btn").bind('click',function () {
$(this).css('color','red');
});
... создаст 101
уникальных Function
экземпляров.
Почему 101
?
Хорошо, что jQuery делает, когда вы впервые привязываете обработчик кэлемент, он создает уникальный универсальный обработчик для каждого элемента.Это обработчик, который фактически вызывается при возникновении события и обрабатывает все типы событий.
Ваша функция обработчика никогда фактически не связана с элементом.
Так что общий внутренний обработчик при вызове будет анализировать произошедшее событие и посмотреть, были ли какие-либо обработчики связаны с данным элементом, используя .bind()
, которые соответствуют этому типу события.Если это так, он вызывает обработчик, который прошел.
Теперь, допустим, вы связываете другой обработчик:
$(".btn").bind('mouseenter',function () {
$(this).css('color','blue');
});
..., поскольку мы привязываемся к тому же элементы, они уже имеют необходимый внутренний обработчик , а другой не нужно создавать.Поэтому все, что происходит, - это то, что на передаваемую вами функцию ссылаются изнутри, и она вызывается универсальным внутренним обработчиком, когда это необходимо.
Таким образом, учитывая приведенные выше фрагменты кода, теперь существует 102
unique Function
экземпляры.