В чем разница между «$ (это)» и «это»?

516

В настоящее время я изучаю этот учебник: Начало работы с jQuery

Для следующих двух примеров:

$("#orderedlist").find("li").each(function (i) {
    $(this).append(" BAM! " + i);
});
$("#reset").click(function () {
    $("form").each(function () {
        this.reset();
    });
});

Обратите внимание, что в первом примере мы используем $(this) для добавления некоторого текста внутри каждого элемента li. Во втором примере мы используем this непосредственно при сбросе формы.

$(this), кажется, используется намного чаще, чем this.

Мое предположение в первом примере, $() преобразует каждый элемент li в объект jQuery, который понимает функцию append(), тогда как во втором примере reset() можно вызвать непосредственно в форме.

В принципе нам нужно $() для специальных функций jQuery.

Правильно ли это?

  • 2
    @ Рейгель, почему это было защищено? ОП задал вопрос и угадал правильный ответ.
  • 21
    @Reigel: Я думаю, что я должен задать это в мета, но если это все, что требуется для защиты, не все ли вопросы должны быть защищены
Теги:
this

7 ответов

452
Лучший ответ

Да, вам нужно только $(), когда вы используете jQuery. Если вы хотите, чтобы jQuery помогала делать вещи DOM, просто помните об этом.

$(this)[0] === this

В принципе каждый раз, когда вы получаете набор элементов обратно, jQuery превращает его в объект jQuery. Если вы знаете, что у вас есть только один результат, он будет в первом элементе.

$("#myDiv")[0] === document.getElementById("myDiv");

И так далее...

  • 2
    Есть ли причина использовать $(this)[0] this если они всегда одинаковы?
  • 2
    @Jay Если вы предпочитаете печатать long, а не просто «this», тогда да. $ () - это функция конструктора jQuery. «this» является ссылкой на элемент вызова DOM. поэтому в основном в $ (this) вы просто передаете this в $ () в качестве параметра, чтобы вы могли вызывать методы и функции jQuery ».
Показать ещё 1 комментарий
369

$() - это функция-конструктор jQuery.

this ссылка на элемент вызова DOM.

Итак, в основном, в $(this) вы просто передаете this в $() в качестве параметра, чтобы вы могли вызывать методы и функции jQuery.

91

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

67

При использовании jQuery рекомендуется использовать $(this) обычно. Но если вы знаете (вы должны узнать и знать) разницу, иногда удобнее и быстрее использовать только this. Например:

$(".myCheckboxes").change(function(){ 
    if(this.checked) 
       alert("checked"); 
});

проще и чище, чем

$(".myCheckboxes").change(function(){ 
      if($(this).is(":checked")) 
         alert("checked"); 
});
  • 8
    Мне понравился пример. Спасибо !
44

this - это элемент, $(this) - объект jQuery, построенный с этим элементом

$(".class").each(function(){
 //the iterations current html element 
 //the classic JavaScript API is exposed here (such as .innerHTML and .appendChild)
 var HTMLElement = this;

 //the current HTML element is passed to the jQuery constructor
 //the jQuery API is exposed here (such as .html() and .append())
 var jQueryObject = $(this);
});

Более глубокий внешний вид

this MDN содержится в контексте выполнения

Сфера действия относится к текущему Контексту выполнения ECMA. Чтобы понять this, важно понять, как контексты выполнения работают в JavaScript.

контексты выполнения связывают это

Когда элемент управления входит в контекст выполнения (в этой области выполняется код), среда для переменных настраивается (Лексическая и переменная среды - по существу это создает область для ввода переменных, которые уже были доступны, и область для локальных переменные, которые необходимо сохранить), и происходит привязка this.

jQuery связывает этот

Контексты выполнения образуют логический стек. В результате контексты, более глубокие в стеке, имеют доступ к предыдущим переменным, но их привязки могут быть изменены. Каждый раз, когда jQuery вызывает функцию обратного вызова, он изменяет эту привязку, используя apply MDN..

callback.apply( obj[ i ] )//where obj[i] is the current element

Результатом вызова apply является то, что внутри функций обратного вызова jQuery, this ссылается на текущий элемент, используемый функцией обратного вызова.

Например, в .each обычно используется функция обратного вызова .each(function(index,element){/*scope*/}). В этой области, this == element является истинным.

Обратные вызовы jQuery используют функцию apply для привязки вызываемой функции к текущему элементу. Этот элемент исходит из массива элементов объекта jQuery. Каждый построенный объект jQuery содержит массив элементов, которые соответствуют селектору jQuery API, который использовался для создания экземпляра jQuery объект.

$(selector) вызывает функцию jQuery (помните, что $ является ссылкой на jQuery, code: window.jQuery = window.$ = jQuery;). Внутренне функция jQuery создает объект функции. Поэтому, хотя это может быть не сразу очевидным, использование $() внутренне использует new jQuery(). Часть конструкции этого объекта jQuery состоит в том, чтобы найти все совпадения селектора. Конструктор также примет html строки и элементы. Когда вы передаете this в конструктор jQuery, вы передаете текущий элемент для объекта jQuery, который будет создан с помощью. Затем объект jQuery содержит массив-подобную структуру элементов DOM, соответствующих селектору (или только одному элементу в случае this).

Как только объект jQuery будет создан, теперь будет открыт API jQuery. Когда вызывается функция jQuery api, она будет внутренне перебирать эту массивную структуру. Для каждого элемента массива он вызывает функцию обратного вызова для api, привязывая обратный вызов this к текущему элементу. Этот вызов можно увидеть в фрагменте кода выше, где obj - структура, подобная массиву, и i - это итератор, используемый для позиции в массиве текущего элемента.

37

Да, используя $(this), вы включили функцию jQuery для объекта. Просто используя this, он имеет только общие функции Javascript.

-1

этот ссылается на объект javascript и $(this), используемый для инкапсуляции с помощью jQuery.

Пример = >

// Getting Name and modify css property of dom object through jQuery
var name = $(this).attr('name');
$(this).css('background-color','white')

// Getting form object and its data and work on..
this = document.getElementsByName("new_photo")[0]
formData = new FormData(this)

// Calling blur method on find input field with help of both as below
$(this).find('input[type=text]')[0].blur()

//Above is equivalent to
this = $(this).find('input[type=text]')[0]
this.blur()

//Find value of a text field with id "index-number"
this = document.getElementById("index-number");
this.value

or 

this = $('#index-number');
$(this).val(); // Equivalent to $('#index-number').val()
$(this).css('color','#000000')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню