2013-11-07 1 views
3

Это своего рода случайный вопрос, но мне было интересно, почему именованный обратный вызов хуже работает для события click по отношению к анонимной функции.jQuery Скорость обратного вызова jQuery: анонимные и именованные функции

Вот ссылка на тесты JSPerf, которыми я управлял в Firefox и Chrome на Mac.

Я предполагаю, что мое предположение заключалось в том, что вызываемые обратные вызовы всегда будут работать лучше. Например, при использовании .each названный обратный вызов is slightly faster.

Спасибо за ваше время!

Редактировать Я редактировал тест .each JSPerf, потому что (а) я не проверял, что я имел в виду, и (б) Я пытаюсь имитировать события более.

Редактировать 2 Моя тестовая установка была неправильной с самого начала, как @Esailija указывает ниже. Этот вопрос несколько бессмыслен, но, по крайней мере, это может помочь кому-то с тестированием JSPerf.

+2

Ваш jsperf с '.each' не является хорошим тестом, так как анонимная функция имеет который должен быть создан и передан во время каждой итерации, но именованную функцию не нужно создавать во время каждой итерации. – kavun

+1

Я понимаю это. Я просто использовал его для сравнения. – doubleswirve

ответ

2

JSPerf нарушаются, потому что вы накапливаете обработчик событий через границу тестирования. В других wrods, независимо от того, какой тест запускается, первым будет «самый быстрый».

И все помещение теста смешно, нет никакой разницы между функцией, которая имеет имя и функцию, которая не имеет имени, если все остальное равно. Вы увидите только разницу при неправильном настройке jsperf. Когда вы постоянно получаете равные результаты для них, тогда вы знаете, что правильно настроили его, но вы уже знаете это по здравому смыслу :)

+0

Как избежать накопления обработчиков событий через границы теста? Могу ли я сделать это, вызвав метод '.off' в разрыве, как предложил Кэвун? Однако я понимаю, что вы имеете в виду, поскольку самым быстрым из них является тот, который запускается первым. Спасибо за вашу помощь! – doubleswirve

+1

@ doubleswirve Технически вам даже не нужно jQuery, так как вы измеряете скорость вызова функции. Но прикрепление обработчика событий только один раз вне тестов, как это работает тоже: http://jsperf.com/jquery-events-anonymous-vs-named-callbacks/4 – Esailija

+0

О, я понял. Извините за беспорядок и спасибо за ваше терпение. Я определенно не тестировал то, что хотел. Еще раз спасибо. – doubleswirve

1

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

Edit: Я пытался доказать это, но кажется, что анонимная функция фактически не разрешится быстрее - http://jsperf.com/scope-chain-anonymous-function

Edit: Если вы звоните a.off();, чтобы удалить все обработчики событий, то именованная функция будет такой же быстрой или быстрой, как разрешение анонимной функции.

+0

Спасибо за ваш ответ. Ваш ответ относится к этому вообще: http://jsperf.com/jquery-event-callback-nested. Я мог бы смутить себя, но я понял, что 'cb_d' был бы самым быстрым. – doubleswirve

+0

Я бы тоже подумал. – kavun

+0

Удаление обработчиков событий с помощью '$ .fn.off()' похоже, разрешает это. – kavun

Смежные вопросы