Jquery $(this)是否查询dom?

Jquery $(this)是否查询dom?,jquery,dom,this,Jquery,Dom,This,我想知道将它传递给jQuery函数是否会导致它在DOM中搜索它。这个问题有特定的背景 假设我有: $('#foo').click(function(){ var id = $(this).attr('id'); var someVal = $(this).data('someVal'); } jQuery将查询DOM以提供其功能,还是所有信息都是从JavaScript对象读取和获取的 在以下方面是否存在性能差异: $('#foo').click(function(){ var el

我想知道将它传递给jQuery函数是否会导致它在DOM中搜索它。这个问题有特定的背景

假设我有:

$('#foo').click(function(){
  var id = $(this).attr('id');
  var someVal = $(this).data('someVal');
}
jQuery将查询DOM以提供其功能,还是所有信息都是从JavaScript对象读取和获取的

在以下方面是否存在性能差异:

$('#foo').click(function(){
  var elem = $(this);
  var id = elem.attr('id');
  var someVal = elem.data('someVal');
}

在这个实例中,它不查询DOM
$()
使用jQuery包装器对象包装
(或其中的任何内容)

通过缓存它:

var $this = $(this);
 // you will see code have a $ before or after a variable ( $this, this$, etc )
 // signifying it is a jQuery wrapped object
只需使用jQuery包装一次即可节省性能。而不是让它进入jQuery并一遍又一遍地包装它。缓存它是一种很好的编码实践


注意:当然,如果您有
$(“#随便什么”)
它将查询DOM,因为您已经为它提供了一个要检索的选择器,然后它用jQuery包装它。所以,如果你要一次又一次地重复使用它,那么保存它也是有意义的<代码>变量$whater=$('#whater')

如果
中有DOM元素,则
$(此)
不会查询DOM。它只是在一个DOM元素周围放置一个jQuery包装器对象

这不是一个昂贵的操作,但您希望避免不必要的操作。例如,您有时会看到这样的代码:

$("some_selector_here").mousemove(function() {
   if ($(this).hasClass('foo')) {
       $(this).doSomething();
   }
   else {
       $(this).doSomethingElse();
   }
});
这是没有理由的。相反:

$("some_selector_here").mousemove(function() {
   var $this = $(this);
   if ($this.hasClass('foo')) {
       $this.doSomething();
   }
   else {
       $this.doSomethingElse();
   }
});
几乎可以肯定的是,在
点击
处理程序中,这并不重要,尽管我仍然认为它的形式很糟糕。但是在经常被调用的情况下,比如
mousemove
,要避免不必要的函数调用和内存分配。:-)