“this”、“$this”和“$(this)”有什么区别?

41

这三种形式有什么区别:

this
$this
$(this)
6个回答

54

在典型的用法中,您通常会看到它们像这样($this 的用法可能有所不同):

  • this - 指当前处理程序中的DOM元素,但在其他情况下可能是完全不同的对象,但它始终是上下文。
  • $this - 通常由 var $this = $(this) 创建,是jQuery包装版本的缓存,用于提高效率(或在许多情况下使用链式调用$(this) 来获得相同的结果)。
  • $(this) - 元素的jQuery包装版本,因此您可以访问所有其方法(特别是$.fn中的方法)。

2
在 jQuery 走红之前,我记得看到 $this 被用来引用父级作用域对象,有点像 var that。然而我能理解 jQuery 现象可能影响了它的含义。 - Luca Matteis
此答案假设我们正在事件处理程序中:Alisey的答案更为通用。 - meouw
@meouw - 我不认为它会假设那样,我在之后立即加了一个警告:“但在其他情况下,这可能是完全不同的对象”。大多数情况下,当你看到这个时,那就是你所处的位置(毕竟我们主要是事件驱动的),但当然不是唯一的地方。 - Nick Craver

32
  • this 是指调用方法的对象。
  • $this 是一个名字不太规范且没有特殊含义的变量。
  • $(this) 调用了一个名字不太规范的函数$,并将this作为唯一参数传递给它。

16
我不同意你的第二点,它对于它所用的目的来说是一个完全有效的名称,它是this的jQuery包装版本...你会称它为什么?考虑到 $var 作为 jQuery 对象的常见约定被广泛使用。至于第三点,你建议用什么替代品?有几个库选择了这个(jQuery、MooTools、Prototype、Microsoft's...),肯定有原因。 - Nick Craver
3
这绝对是jQuery对象$(this)的一个广泛使用的规则,甚至在我记忆中也被用于jQuery UI插件中。 - jamiebarrow
5
"$"的命名不太好,主要是有两个原因。首先,它并不能告诉你函数的作用,即使有六个库都使用"$",但它们用于不同的事情,并不能帮助那些需要处理代码的人弄清楚使用了哪个库(当多个库同时使用时,情况就更加糟糕了)。其次,ECMA-262第3版规定:“美元符号只用于机械生成的代码”,这是防止这种代码与手写代码冲突的好方法。至于节省带宽,这就是缩小器的作用。 - Quentin
1
@David - 缩小器会选择哪个更短的变量?此外,在页面中的代码通常没有缩小(事实上这很麻烦)。使用多个库是另一个问题...为什么要使用两个?当然我同意尽一切可能避免这种情况...但这个论点取决于第一个,如果它们都使用“_”,则会出现相同的问题。至于ECMA-262第3版(第3版现在已接近11年),那是一个非常旧的规范,第5版因为某种原因删除了该语句。 - Nick Craver
3
第三版的日期是1999年,当时Geocities是最流行的事情之一(我们真的想基于那个时代的标准进行开发吗?),并且在几乎所有主要的库甚至只是一个梦想的时候发布。看看每个版本的第一次发布时间:Prototype: 2005年,jQuery:2006年,MooTools:2006年... 当第三版发布时,这甚至不是一个问题,事情一直在变化/发展。 - Nick Craver
显示剩余3条评论

9

在jQuery事件处理程序中:

  • this - 是您分配事件处理程序的DOM元素
  • $(this) - 是从该元素创建的jQuery对象
  • $this - 通常是一个变量,保存$(this)的结果

更一般地说:

  • this inside a function refers to the object or primitive the function is called on. When a function is used as a constructor, it refers to the new object being constructed. Outside of any function this refers to the global object (window in non-strict mode).

    You can find a good detailed explanation on MDN.

  • $this is a variable name. In JavaScript variable names can start with $. Some like to use it as a prefix for variables containing jQuery objects:

    var body = document.body;   // no prefix for a plain DOM object
    var $body = jQuery('body'); // prefix for the same object wrapped in jQuery
    var $this = $(this);
    
  • $(this) is a function call, where $ is a function name, and this is its argument:

    var $ = alert;
    $(this); // [object Window]
    

    $ doesn't have any special meaning per se. But jQuery defines the $() function as a shorthand for jQuery(). Depending on its arguments, this function can do many different things.


1
在jQuery的上下文中,“this”是被调用方法的对象。“$this”确实是一个没有特殊含义的命名不当的变量。“$(this)”将“this”传递给jQuery,只要“this”是DOM对象,jQuery就会返回与之关联的jQuery对象。

1

对David所说的进行扩展:

  • $this通常用于在当前作用域中拥有this对象的副本。例如,使用var $this = this;,您可以在当前作用域中任何地方使用变量$this,并始终能够引用该对象,否则如果仅使用this引用,则会更改...我个人不喜欢$this命名约定,而更喜欢像var parentScope这样的东西。

  • $(this)是一些框架(如jQuery或PrototypeJs)使用的函数(var $ = function(){})。之所以使用它,是因为$someLongFunctionName更容易输入,而且由于通常在代码中多次调用它,因此最好尽可能缩短它。


0

更多上下文会更有助于回答您的问题。

不过我猜您是在询问关于回调函数中变量的问题(例如 click 事件)。

  • this 是处理程序的上下文(通常是 DOM 元素,在 DOM 事件处理程序的情况下)
  • $this 通常用于存储 $(this) 的结果
  • $(this) 返回包装 this 的 jQuery 对象 - 有关更多信息,请参见 jQuery 文档

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