Почему 'this' в обратных вызовах jquery с цепочкой является элементом DOM? - PullRequest
6 голосов
/ 09 января 2012

Итак, я знаю, что при использовании $.fn.each, $.fn.bind и т. Д., Ключевое слово this в обратных цепочках jQuery является стандартным элементом DOM.

Я знаю, что в моей разработке, по крайней мере, я хочу, чтобы элемент DOM был заключен в набор jQuery - 90% времени я в конечном итоге делаю var $this = $(this). Я уверен, что было хорошее (вероятно, основанное на производительности) обоснование того, почему они решили связать с развернутым элементом, но кто-нибудь знает, что именно это было?

Это одна из тех вещей, на которые, мне кажется, зная ответ, может открыть дверь для понимания библиотеки и языка на более глубоком уровне.

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я уверен, что было хорошее (вероятно, основанное на производительности) обоснование

Я уверен, что это именно так.Если есть вероятность того, что вам может не понадобиться обертка jQuery (которая есть - вряд ли редко можно работать непосредственно со свойствами DOM, особенно при обратных вызовах функций, подобных val; на самом деле, вам вообще может не понадобиться смотреть на элемент) тогда вы не хотите тратить время и ресурсы на создание объекта jQuery.

Например, - это jsperf , который показывает, что выполнение $(this) для каждого элемента вцикл несет примерно столько же служебных данных, сколько сама функция each.

2 голосов
/ 09 января 2012

Если кто-то не в состоянии указать на статью Джона Резига, конкретно касающуюся этого вопроса, я сомневаюсь, что на этот счет предлагается окончательный ответ. Но я часто задавался этим вопросом, когда начинал использовать jQuery, и пришел к выводу, что это наименее вредная вещь. В конце концов, вполне возможно, что все, что вам нужно, это элемент DOM. Если вам нужно / вы хотите использовать оболочку jQuery, то $() - это всего три нажатия клавиш (или больше из вас делают var $this = $(this);). В отличие от того, что библиотека всегда делает это за вас, что включает в себя несколько вызовов функций и выделение памяти, когда вполне может оказаться, что вам это не нужно.

Например, рассмотрим:

$("input").each(function() {
    // Use this.value
});

Там нет никаких оснований для оболочки jQuery вокруг элемента DOM. this.value - это все, что вам нужно для всех полей input (кроме input type="file", но val() вам там тоже не поможет). В обработчиках событий (где this также является «просто» необработанным элементом), вы можете вообще не смотреть на this.

Но в этом случае:

$(":input").each(function() {
    var val = $(this).val();
    // Use `val`
});

... есть подлинная причина использования $(this): селектор :input соответствует нескольким различным типам элементов (input, select, button, textarea), для которых значение получается из разных свойства, и val() тезисы, которые для вас.

Итак, я пришел к выводу, что предоставление необработанного элемента - это производительность. Если вы вообще не используете его или используете только базовые свойства DOM, нет необходимости заключать его в экземпляр jQuery. Если вам нужно / хотите сделать это, вы можете сделать это в своем коде.

...