$ this проти $ (this) у jQuery


76

Я бачив деякі дискусії щодо SO щодо $(this)vs $thisв jQuery, і вони для мене мають сенс. (Див. Дискусію тут для прикладу.)

Але як щодо фрагмента нижче, з підручника з веб-сайтів jQuery, який показує, як працює прив’язка до мережі?

(function ($) {

    $.fn.lockDimensions = function (type) {

        return this.each(function () {

            var $this = $(this);

            if (!type || type == 'width') {
                $this.width($this.width());
            }

            if (!type || type == 'height') {
                $this.height($this.height());
            }

        });

    };
})(jQuery);

Що означає $thisвище? Просто коли я думаю, що я це зрозумів ...


3
var $this = $(this);- це просто короткий випадок, коли вам не потрібно jQuerify thisпід час кожного дзвінка.
— bzlm

1
У вашому коді $thisє локальна змінна, яка кешує $( this )об'єкт jQuery.
— Šime Vidas

12
Що незрозуміло var $this = $(this)? Цей рядок коду $thisдорівнює $(this).
— Matt Ball

2
@CAbbott: Це зовсім не дублікат. $this !== this
— Метт

16
Я пишу свою відповідь ... tralala ... потім раптом з’являється повідомлення: «Опубліковано 11 нових відповідей». Га ...:D
— Шіме Відас

Відповіді:


120

$thisє просто звичайною змінною. $Символ є допустимим символом в іменах змінних, так$this діє так само , як і будь-яка інша , НЕ зарезервоване ім'я змінного. Це функціонально ідентично виклику змінної JellyBean.


33
Зазвичай ви називаєте $ vars, коли вони є об'єктами jQuery, тому ви пам'ятаєте, що це $, а не прості об'єкти JavaScript.
— agbb

67

Зазвичай ви використовуєте, var $this = $(this);щоб уникнути створення нового об’єкта jQuery частіше, ніж це потрібно. У випадку коду нижче ви створюєте лише один об'єкт замість двох / чотирьох. Це абсолютно не пов’язано з привабливістю.

Можна також назвати це that, $thi$або що - небудь ще (не використовувати останній один , хоча, це некрасиво: р) , як $це тільки простий символ в JavaScript, так само , як я є.



34

thisу javascript (зазвичай) являє собою посилання на об'єкт, який викликав поточну функцію. Ця концепція дещо розмита завдяки спробам jQuery зробити використання thisбільш зручним для користувачів у межах їх .each()циклічної структури.

поза.each() ,thisпредставляє об'єкт JQueryякий.lockDimensionsвикликається.

всередині.each() вона представляє поточний об'єкт итерационного DOM.

Як правило, метою зберігання $(this)в локальній змінній є запобігання виклику функції jQuery $() кілька разів , кешування jQueryized this повинно сприяти ефективності, якщо вам доведеться використовувати її кілька разів.

$є просто дійсним символом імені змінної та використовується як перший символ імені змінної, як правило, щоб поставити програміста в чергу, що він уже є об’єктом jQuery (і має відповідні методи / властивості).

Це питання насправді не пов'язане з ланцюговою здатністю, але для підтримки ланцюгової здатності ви повинні повернутися, thisщоб можна було додати інші виклики функцій, а також підтримувати значення thisцих дзвінків.


1
Дякую за пояснення $(this):)
— Собіахолік

14

Ви, можливо, пропустили цей рядок:

var $this = $(this);

Тут $thisпросто змінна, що містить значення $(this). Ви можете використовувати його взаємозамінно, з $(this)тим перевагою, що ви не робите однаковий пошук знову і знову.


12

$thisце просто локальна змінна, названа таким чином, щоб нагадати вам $(this). Це економить роботу зі створення версії jQuery this, і ви можете використовувати її кілька разів.


10

$this- це просто локальна копія thisзагорнутого в jQuery.

У довгостроковій перспективі зберігати локальну копію, а не обгортати її thisкожного разу, коли це потрібно, набагато ефективніше.


Ви маєте рацію, замість того, щоб постійно викликати функцію, щоб отримати посилання, кешована копія - кращий вибір.
— Тарік

10

$this = $(this)є способом кешування об’єкта jQuery. Кожного разу запустити функцію jQuery, тому зберігання вихідних даних дозволяє повторно використовувати селектор знову і знову, не викликаючи функції jQuery знову.


9

Він просто заповнює $thisзмінну $(this), так що вам не потрібно шукати $(this)кожен виклик елемента. Він має кращі показники

var $this = $(this);

9
 $this = $(this)

це означає, що ви присвоюєте поточний об'єкт змінній з іменем $this. Це не ключове слово.

Це просто ім'я змінної.


7

Це досить просто: $this = $(this). Це просто скорочення, що використовується в області внутрішньої функції. Знак долара в цьому випадку є лише символом, він взагалі не відноситься до jQuery. Це могло бути так само добре названо _thisабо xthis, $це лише нагадування про те, що містить змінна.

Це може здатися безглуздим, але він усуває три зайві виклики методів ( $()функція не є безкоштовною), тому вона, швидше за все, використовується там з міркувань продуктивності.


7

Всередині $.fn.lockDimensions, thisтобто об'єкт JQuery , який lockDimensionsназивається на ній.

Усередині .each, thisтепер посилається на DOMElement у поточній ітерації циклу. $(this)обгортає DOMElement в об’єкт jQuery і var $this = $(this);просто зберігає $(this)у викликовій змінній $this, тому конструктору jQuery не потрібно викликати кілька разів (якщо $(this)замість цього ви використовували ).


7

$знак зазвичай використовується перед іменами змінних у JavaScript, щоб розрізнити загальне значення та об'єкт jQuery. Отже, тут $thisпросто отримується значення, $(this)яке повертає об'єкт jQuery з this. $є лише частиною дійсного імені змінної.


4

$this- змінна з іменем, $thisщо містить посилання на $(this). Трохи безглуздо IMO.


9
Безглуздо? Це усуває створення 4 окремих об’єктів jquery того самого.
— Ендрю

6
@Andrew, безумовно, хтось, кого називають Спендером, не піклується про те, щоб витрачати більше процесорних циклів, ніж потрібно.
— bzlm

Так. Це проблема? Поки це помірно проблематично, це не проблема.
— Спендер

Це також усуває 18 символів зі зменшеного файлу.
— Ендрю

@spender, іди виміряй і віднови свою честь! :)
— bzlm

4

Я хочу заскочити сюди, хоча я не маю експертних навичок jQuery.

Незліченну кількість разів я бачу рядки коду або поняття, подібні до:

var $this = $(this);

Тож я переробляю його подібно до:

var $jims_this = $(this);

І перевірити це. Також я роблю це, щоб усунути будь-яку плутанину, яка може виникнути у мене.

Ось ще один приклад подібного погано поясненого коду:

 <style>
    a.a { font-weight: bold; }
 </style>

Потім додайте виклик addClass до вашого сценарію:

  $("a").addClass("a");

Це працює, але бентежить. Це можна було записати так:

<style>
a.my_bold_class { font-weight: bold; }
</style>

 $("a").addClass("my_bold_class");

Джим


-5

Ви заблукали у сферу дії та закриття javascript.

Короткий відповідь:

this.bar()

виконується в межах foo, (оскільки це стосується foo)

var barf = this.bar;
barf();

виконується в глобальному масштабі.

this.bar в основному означає:

виконати функцію, на яку вказує this.bar, у межах цього (foo). Коли ви скопіювали this.bar в barf, і запустіть barf. Javascript розуміється як запуск функції, на яку вказує barf, і оскільки цього немає, він просто працює в глобальному масштабі.

Щоб виправити це, ви можете змінити

barf();

до приблизно такого:

barf.apply(this);

Це говорить Javascript прив’язати область дії до barf перед його виконанням.

Для подій jquery вам потрібно буде використовувати анонімну функцію або розширити функцію прив'язки в прототипі для підтримки масштабування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.