2012-01-03 117 views
9

我经常看到在jquery中使用关键字this的示例。有时候我会发现它和$和括号一起使用,有些时候没有。而且我认为我看到它每个都使用了一点。

所以,

var id = this.attr('id'); 

var id = $(this).attr('id'); 

var id = $this.attr('id'); 

难道这些都是一样的?有没有一种首选方式?是一个JavaScript事情this$(this)一个jQuery的东西?如果是这样,$this在哪里下降?

我知道这可能是一个总的新手问题,但我一直无法得到简单的,this,本身,工作。我只能得到$(this)才能工作。我不确定我是否做错了什么,或者我是否正在阅读错别字的例子。

+1

'this'是一个js自引用,并且把$()用jquery类包装起来。是什么引用$ this--它只是一个变量名(不是预定义的),通常用在jquery插件中,以便始终引用子类中的第一级父类 – 2012-01-03 22:49:29

回答

10

this是一个JavaScript的东西。它指的是函数运行的“上下文”。对于大多数事件处理程序来说,它是正在监听事件的(“原始”)DOM元素。在其他情况下,这将意味着其他事情;使用Google搜索“this”可能会有所启发。


我说,这是“原始”的DOM元素,因为jQuery是经常被用来包裹平原DOM元素在一个jQuery包装,所以你可以使用jQuery方法如attr而不是通常的那些(getAttributesetAttribute等)。这个包装是用$函数完成的,这就是你看到$(this)的地方。例如:

this.getAttribute("href") 
/* or */ someElement.getAttribute("href") 

相同

$(this).attr("href") 
/* or */ $(someElement).attr("href") 

$thisthis$仅仅是一个变量名。但是,它不喜欢

var $this = $(this); 

的分配往往是传统这样做的原因是为了避免不断地调用$功能,这是比较昂贵的,因为它创建了一个新的jQuery包装对象每次。如果将包裹的元素存储在变量中,则效率稍微有所提高。


在极少数情况下,this可能已经是jQuery包装器。我经常遇到的情况是编写jQuery插件时。在这种情况下,你可以直接做this.attr("id")之类的事情,而不是先把它包起来,因为它已经被包装好了。在通常情况下(事件处理程序,$.each等)包装是必要的。

+0

+1很好的答案。很彻底。 – ThinkingStiff 2012-01-03 23:04:28

+0

是的,很好的答案。最后一部分有助于解释我在某处读过的东西,但可以再次找到它。我看到使用了'this.attr(“id”)',但它对我没有用。我认为这是最让我困惑的。 – 2012-01-04 15:08:12

5

this是引用当前对象的本机JavaScript对象。在用jQuery.fn.定义的jQuery函数中,this本身就是一个jQuery对象。 $(this)是jQuery将Javascript this转换为jQuery对象的方式。而$this只是一个变量名。如果你还没有定义它,那将是undefined

这里是this jQuery的使用的一个很好的解释:

http://www.learningjquery.com/2007/08/what-is-this

+1

'this'不仅用于事件处理程序,它是对当前对象的引用。这里有一个进一步的解释:http://justin.harmonize.fm/index.php/2009/09/an-introduction-to-javascripts-this/ – voithos 2012-01-03 22:49:21

+0

@voithos谢谢。更新。 – ThinkingStiff 2012-01-03 22:51:22

8

“这”是指当前对象的Javascript对象的关键字,“$(本)”是jQuery的包装功能将当前对象转换为jQuery对象,并且当您看到'$ this'时,它通常指的是开发人员创建的用于引用$(this)对象的变量,它在$ .each循环中很有用。例如:

$(function(){ 
    $('a').click(function(){ 
    var $this = $(this); // refers to the $('a') object 
    $('div').each(function(){ 
     $(this).hide(); // $(this) refers to each 'div' in the loop, not the $('a') 
     $this.css({ color: 'blue' }); // turns the link element text blue 
    }); 
    }); 
}); 
+0

您能解释一下您的答案,以显示何时以及为什么简单'this'可以发挥作用 – veeTrain 2012-05-08 14:33:42

+0

在这种情况下使用简单'this'的唯一原因是如果您需要访问原始DOM节点上的方法或变量,例如如下所示:http://www.w3schools.com/jsref/dom_obj_node.asp 例如,你不能在普通的'this'上使用jQuery方法,例如:this.hide(); – afrederick 2012-05-09 15:27:06

+0

哦,我明白了。那么可以肯定地说,你对'this'执行的任何'操作'都有可能不符合跨浏览器的要求。尽管将它包装在'$()'中并使用jQuery方法会更安全吗?因为OP想知道关于'this'的这些含义,所以更新你的答案可能是个好方法 – veeTrain 2012-05-09 17:03:21

1

而不是多次调用$(this),将其作为变量存储更为高效,通常称为$this,以便人们知道它是什么。