jQuery中的$ this vs $(this)


76

我已经看过关于jQuery与$(this)vs的一些讨论$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以上代表什么?就在我想知道了的时候...


3
var $this = $(this);-不必this每次调用jQuerify只是一种捷径。
bzlm 2011年

1
在您的代码中$this是一个局部变量,用于缓存$( this )jQuery对象。
森那维达斯

12
不清楚什么var $this = $(this)?该行代码$this等于$(this)
马特·鲍尔

2
@CAbbott:根本不是重复的。$this !== this
马特

16
我在写我的答案... tralala ...然后突然出现一条消息:“已发布11个新答案”。呵呵...:D
森那维达斯

Answers:


120

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


33
通常您将$ vars命名为jQuery对象时使用,因此请记住它们是$而不是简单的JavaScript对象。
2011年

67

通常var $this = $(this);,您通常避免避免不必要地创建新的jQuery对象。在下面的代码中,您只能创建一个对象,而不是两个/四个。它与可链接性完全无关。

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



34

thisjavascript中的(通常)表示对调用当前函数的对象的引用。jQuery试图this在其.each()循环结构中使用更多用户友好性的方法,对此概念有些模糊。

外部.each()this表示由.lockDimensions调用的jQuery对象。

其中,.each()它代表当前迭代的DOM对象。

通常,存储$(this)在局部变量中的目的是防止您$() 多次调用jQuery函数,如果您必须多次使用jQueryized ,则缓存jQueryizedthis应该会提高效率。

$是一个简单的有效的变量名字符,并且被用作变量名称的第一个字符通常排队编程,这是一个jQuery对象已经(并具有相关联的方法可用/属性)。

这个问题实际上与链接能力无关,但是要保持链接能力,您应该返回,this以便可以添加其他函数调用,并this在这些调用中也保持其含义。


1
感谢您的解释$(this):)
Sobiaholic 2014年

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


7

这是相当简单:$this = $(this)。这只是内部函数范围内的简写形式。在这种情况下,美元符号只是一个字符,根本不涉及jQuery。它可能也已被命名为_thisxthis,这$只是在提醒该变量包含什么。

看起来似乎没有意义,但是它消除了三个冗余方法调用(该$()函数不是免费的),因此出于性能原因很可能在此使用它。


7

在里面$.fn.lockDimensionsthis是具有lockDimensions调用它。

在中.eachthis现在在循环的当前迭代中引用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对象的麻烦。
安德鲁(Andrew)

6
@Andrew,肯定有人叫Spender不在乎花费不必要的CPU周期。
bzlm 2011年

是的 那是一个问题吗?直到出现可衡量的问题,这才不是问题。
支出者

它还从缩小的文件中消除了18个字符。
安德鲁(Andrew)

@spender,去衡量它并恢复您的荣誉!:)
bzlm 2011年

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(foo)的范围内执行this.bar指向的函数。当您将this.bar复制到barf并运行barf时。Javascript被理解为运行barf指向的函数,并且由于没有此功能,因此它只能在全局范围内运行。

要更正此问题,您可以更改

barf();

像这样:

barf.apply(this);

这告诉Javascript在执行之前将其范围绑定到barf。

对于jquery事件,您将需要使用匿名函数或在原型中扩展bind函数以支持作用域。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.