$this вместо $(this) в jQuery
Я видел некоторые дискуссии на так относительно $(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 представляют? Как раз тогда, когда я думаю, что все понял ...
15 ответов:
$thisЭто просто обычная переменная. Элемент$символ является допустимым символом в имени переменной, так$thisдействует так же, как и любое другое незарезервированное имя переменной. Это функционально идентично вызову переменнойJellyBean.
вы обычно используете
var $this = $(this);чтобы избежать создания нового объекта jQuery чаще, чем это необходимо. В случае кода ниже вы создаете только один объект вместо двух / четырех. Это совершенно не связано с цепью.вы также можете назвать его
that,$thi$или что-нибудь еще (не используйте последний, хотя это некрасиво :p) как$это просто простой символ в JavaScript, точно так же, как a-z являются.
thisв javascript (обычно) представляет собой ссылку на объект, который вызвал текущую функцию. Это понятие несколько fuzzied немного попытками в jQuery, чтобы сделать использованиеthisболее удобный в их.each()циклическую структуру.за пределами the
.each(),thisпредставляет объект jQuery, который.lockDimensionsвызывается от.внутри the
.each()Он представляет текущий итерированный объект DOM.вообще цель хранить
$(this)в локальной переменной, чтобы предотвратить вызов функции jQuery$()несколько раз, кэширование a jQueryizedthisдолжны помочь эффективность, если вы должны использовать его несколько раз.
$является просто допустимым символом имени переменной и используется в качестве первый символ имени переменной обычно чтобы поставить в очередь программиста, что это уже объект jQuery(и имеет связанные методы/свойства).этот вопрос фактически не связан с цепной способностью, но для поддержания цепной способности вы должны вернуть
thisТак что другие функции могут быть добавлены, и поддерживать значениеthisи в этих звонках тоже.
возможно, вы пропустили эту строку:
var $this = $(this);здесь
$this- это просто переменная, которая содержит значение$(this). Вы можете использовать его взаимозаменяемо с$(this)С тем преимуществом, что вы не делаете один и тот же поиск снова и снова.
$thisЭто просто локальная переменная, названная таким образом, чтобы напомнить вам о$(this). Это экономит работу по созданию jQuery версииthis, и вы можете использовать его несколько раз.
$this- Это просто локальная копияthisзавернутый в jQuery.в долгосрочной перспективе, сохраняя локальную копию, а не накрутка
thisкаждый раз, когда это необходимо, намного эффективнее.
$this = $(this)- Это способ кэширования объекта jQuery. Каждый раз запускать функцию jQuery дорого, поэтому сохранение выходных данных позволяет повторно использовать селектор снова и снова без повторного вызова функции jQuery.
Он просто заполняет
$thisпеременной с$(this), Так что вам не придется искать$(this)элемент каждого вызова. Он имеет лучшую производительностьvar $this = $(this);
$this = $(this)это означает, что вы присваиваете текущий объект переменной с именем
$this. Это не ключевое слово.Это просто имя переменной.
Это довольно просто:
$this = $(this). Это просто стенография, используемая в области внутренней функции. Знак доллара-это просто символ в этом случае, он вообще не относится к jQuery. С таким же успехом его можно было бы назвать_thisилиxthisна$- это просто напоминание о том, что переменная содержит.это может показаться бессмысленным, но он устраняет три избыточных вызова метода (
$()функция не бесплатна), поэтому она, скорее всего, используется там для производительности причины.
внутри
$.fn.lockDimensions,this- это объект jQuery, который имелlockDimensionsпризвал он.внутри
.each,thisтеперь ссылается на элемент DOMElement в текущей итерации цикла.$(this)обертывает элемент DOMElement в объект jQuery иvar $this = $(this);это просто спасение$(this)в переменной с именем$this, поэтому конструктор jQuery не нужно вызывать несколько раз (если вы должны были использовать$(this)вместо).
$знак обычно используется перед именами переменных в JavaScript, чтобы различать общее значение и объект jQuery. Так вот$thisпросто получает значение$(this)который возвращает jQuery объектthis.$- Это только часть допустимое имя переменной.
Я хочу прыгнуть сюда, хотя у меня нет экспертных навыков 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");Джим
вы забрели в область области javascript и закрытия.
ответ:
this.bar()выполняется в рамках foo, (как это относится к foo)
var barf = this.bar; barf();выполняется в глобальной области.
этого.бар в основном означает:
выполните функцию, на которую указывает это.бар, в рамках этого (foo). Когда вы скопировали это.бар блевать, блевать и бежать. Javascript понимается как, запустить функцию указал по блевотине, и поскольку этого нет, он просто работает в глобальном масштабе.
чтобы исправить это, вы можете изменить
barf();что-то вроде этого:
barf.apply(this);Это говорит Javascript, чтобы привязать область этого к barf перед его выполнением.
для событий jquery вам нужно будет использовать анонимную функцию или расширить функцию привязки в прототипе для поддержки области видимости.