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

567

В настоящее время я работаю над этим учебником: Начало работы с 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
@ Рейгель, почему это было защищено? ОП задал вопрос и угадал правильный ответ.
Vol7ron
21
@Reigel: Я думаю, что я должен задать это в мета, но если это все, что требуется для защиты, не следует ли защищать
vol7ron

Ответы:

516

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

$(this)[0] === this

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

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

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

Спенсер Рупорт
источник
3
Есть ли причина , чтобы использовать $(this)[0]более , thisесли они всегда то же самое?
Джей
2
@Jay Если вы предпочитаете печатать long, а не просто «this», тогда да. $ () - это функция конструктора jQuery. «this» является ссылкой на элемент вызова DOM. поэтому в основном в $ (this) вы просто передаете this в $ () в качестве параметра, чтобы вы могли вызывать методы и функции jQuery ».
Джуливер Галлето
2
@jay - Нет веской причины для использования, $(this)[0]я просто использовал это, чтобы проиллюстрировать концепцию. :) Я использую в $("#myDiv")[0]течение document.getElementById("myDiv")хотя.
Спенсер Рупорт
369

$() является функцией конструктора jQuery

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

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

Reigel
источник
92

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

Алекс Кинг
источник
74

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

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

легче и чище, чем

$(".myCheckboxes").change(function(){ 
      if($(this).is(":checked")) 
         alert("checked"); 
});
Фредрик Гаусс
источник
9
Мне понравился пример. Спасибо !
Аммар
46

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);
});

Более глубокий взгляд

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

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

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

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

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

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

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 содержит массив элементов, которые соответствуют API селектора jQuery, который использовался для создания экземпляра объекта jQuery.

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

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

Трэвис Дж
источник
39

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

Рэй Лу
источник
-1

thisссылаются на объект 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')
Лалит Кумар Маурья
источник