2014-09-10 262 views
3

假設我有一個匹配「.foo」的元素。

<div class="foo"></div> 

我從經驗中學到了多次調用查找器的性能,如果我試圖多次更改同一個對象。

$(".foo").doOneThing(); 
$(".foo").doAnotherThing(); 
$(".foo").doSomethingElse(); 
// Makes jQuery look for ".foo" three times, bad! 

$foo = $(".foo"); 
$foo.callAllThreeOfTheThingMethodsInThePreviousBlock(); 
// Calls $(".foo") only once, but occupies memory with a jQuery object version of the foo div. 

我的問題是,有多少次你必須留出內存來存放jQuery對象,而不是再次作出了jQuery方法調用之前使用這個取景器?

我問,因爲有一天,我讓每一個發現者多次調用一個存儲的$ object變量;如果我只使用取景器,比如說兩三次,我的老闆曾經說過要使用取景器而不是存儲的物體。你對此有何看法?

+0

三次找到相同的項目是沒有意義的,最好將它保存到局部變量中! – 2014-09-10 18:02:48

+0

如果出現不止一次,我傾向於解除它。我爲所有事情做到了,即使是簡單的字符串。還有'$(「。foo」)。doOneThing()。doAnotherThing()。doSomethingElse();'會工作太大聲。 <3鏈。 – RaphaelDDL 2014-09-10 18:10:47

+1

只需要一小搗蛋器來展示兩種不同的方式如何與大量操作相互作用。 http://plnkr.co/edit/lb3Cew3j1p5HE5goCgqd?p=preview – Pr0gr4mm3r 2014-09-10 19:05:47

回答

3

使用var $foo = $(".foo");

使用$(".foo")多時間會讓jQuery的重複搜索。看起來jQuery並沒有緩存選擇器,即使它做到了,最好是自己聰明一點,不要依賴別人。

Does jQuery do any kind of caching of 「selectors」?

+1

我不認爲jQuery緩存選擇器。如果確實如此,那肯定會有些嚴重的魔力,因爲dom可能會改變並且搞砸了一切。 – m59 2014-09-10 18:11:46

+0

@ m59好點。編輯。 – kornieff 2014-09-10 18:17:23

+2

這是OP用例的正確答案,但值得注意的是,將jQuery對象「保存」到變量中會在搜索時緩存選擇內容 - 嘗試在DOM更改後再次使用它可能會給您帶來意想不到的效果結果。 – nrabinowitz 2014-09-10 18:22:22

1

存儲在變量中的查詢結果在該查詢的repetetive多數情況下推薦。 根據您的情況,您也可以像這樣繼續調用函數。

$(".foo").doOneThing().doAnotherThing().doAnotherThing(); 
相關問題