jQuery中的$this与$(this)有什么区别?

77

我在Stack Overflow上看到一些关于jQuery中$(this)$this的讨论,它们对我来说很有意义。(例如,请参见此处的讨论。)

但是下面这个片段怎么样呢?它来自于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代表什么?就在我认为我已经理解的时候...


4
var $this = $(this); 这段代码是为了简化代码书写而使用的。它的作用是将 this 对象转换成 jQuery 对象并赋值给 $this 变量。这样在后续调用 jQuery 方法时就不需要每次都重新将 this 转换成 jQuery 对象了。 - bzlm
1
在你的代码中,$this是一个本地变量,用于缓存$( this ) jQuery对象。 - Šime Vidas
12
var $this = $(this) 这行代码的意思是将 $this 赋值为当前元素 $(this) - Matt Ball
2
@CAbbott: 这根本不是重复的。$this !== this - Matt
16
我正在写答案......嘟嘟嘟......突然弹出一条消息:“有11个新答案已发布”。哦...... :D - Šime Vidas
显示剩余5条评论
15个回答

122

$this 只是一个普通的变量。在变量名中,$ 字符是一个有效的字符,因此 $this 的作用和任何其他非保留变量名相同。它在功能上与调用变量 JellyBean 相同。


34
通常在命名jQuery对象时会加上$前缀,以此来区别普通的JavaScript对象。这样做可以让你记住它们是jQuery对象而不是普通的JavaScript对象。 - agbb

69

通常使用var $this = $(this);来避免不必要地创建新的jQuery对象。在下面这段代码中,您只创建了一个对象而不是两个/四个。这与链式调用没有任何关系。

您也可以将其称为that$thi$或其他任何名称(不要使用后者,它很丑:p),因为$只是JavaScript中的一个简单字符,就像a-z一样。


1
+1 相关问题 关于 $(this) 的成本。 - gdoron

36
在JavaScript中,this(通常)表示对调用当前函数的对象的引用。而jQuery在其.each()循环结构中试图使this的使用更加用户友好,这个概念会有些模糊。
.each()this表示调用.lockDimensions的jQuery对象。
.each(),它表示当前迭代的DOM对象。
通常将$(this)存储在本地变量中的目的是为了防止您多次调用jQuery函数$(),如果必须多次使用它,则缓存一个已经转换成jQuery对象的this应该有助于提高效率。 $只是一个有效的变量名称字符,并且通常作为变量名的第一个字符使用,以提示程序员它已经是一个jQuery对象(并且具有相关的方法和属性)。
实际上,这个问题与链式调用无关,但为了保持链式调用,您应该返回this,以便可以添加其他函数调用,并在这些调用中保持this的含义。

1
谢谢你解释 $(this) :) - Sobiaholic

14

你可能忽略了这一行:

var $this = $(this);

在这里,$this 只是一个保存 $(this) 值的变量。你可以与 $(this) 交替使用它,好处是避免进行多次相同的查找操作。


12

$this 只是一个本地变量,以此命名是为了提醒您 $(this)。它可以节省创建 jQuery 版本的 this 的工作,而且您可以多次使用它。


10
 $this = $(this)

这意味着你正在将当前对象分配给一个名为$this的变量。它不是一个关键字。

它只是一个变量名。


10

$this是jQuery包装过的this的本地副本。

从长远来看,保留本地副本而不是每次需要时都重新包装this会更加高效。


你是对的,不要每次都调用函数来获取引用,缓存副本是更好的选择。 - Tarik

10

$this = $(this) 是缓存 jQuery 对象的一种方式。每次运行 jQuery 函数是很耗费资源的,因此将输出结果存储起来可以让您重复使用选择器,而无需再次调用 jQuery 函数。


9

它只是将$this变量填充为$(this),因此您无需在每次调用时查找$(this)元素。 它具有更好的性能。

var $this = $(this);

7
很简单: $this = $(this)。这只是在内部函数范围内使用的速记法。在这种情况下,美元符号只是一个字符,它根本不涉及jQuery。它可能也可以被命名为_thisxthis,美元符号只是提醒变量包含的内容。
虽然看起来毫无意义,但它消除了三个冗余的方法调用($()函数不是免费的),因此最有可能出于性能原因在那里使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接