2012-11-15 34 views
10

我想知道是否將此傳遞給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'); 
} 

回答

10

它不查詢DOM在這種情況下。 $()用jQuery包裝器對象包裝this(或其他任何你有的東西)。

通過緩存它:

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內部並且一遍又一遍地包裝它。緩存它是一種很好的編碼習慣。

注:當然,如果你有$('#whatever')將查詢DOM,因爲你已經爲它提供檢索一個選擇的話,就用jQuery包裝它。所以如果你一遍又一遍地重複使用它,保存它也是有意義的! var $whatever = $('#whatever');

8

如果您在this中有DOM元素,則$(this)不會查詢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(); 
    } 
}); 

幾乎可以肯定沒有關係的,比如說,一個click處理器,雖然我還是會說這是一種欠佳。但是在被調用的東西中,比如mousemove,避免不必要的函數調用和內存分配。 :-)