2012-02-13 78 views
1

我讀道場查詢教程,看到Dojo限制查詢?

// retrieve an array of nodes with the class name "odd" 
// from the first list using a selector 
var odds1 = query("#list .odd"); 

// retrieve an array of nodes with the class name "odd" 
// from the first list using a DOM node 
var odds2 = query(".odd", document.getElementById("list")); 

,他們解釋說,odds2比odds1更快,因爲在#list DOM,而不是整個HTML DOM .odd odds2搜索。我想知道的是做odds1的好處是什麼(除了更乾淨的代碼,我猜)?因爲在我看來,查詢在id元素中搜索對象的任何情況下都應該始終使用odds2樣式(假設使用正確的id和class html),那麼dojo爲什麼不自動分析odds1中的查詢字符串來調用odds2?

回答

2

那麼看代碼(http://svn.dojotoolkit.org/src/dojo/trunk/query.js查詢和http://svn.dojotoolkit.org/src/dojo/trunk/selector/acme.js默認選擇器引擎)則顯得「大」的性能提升來自於一個事實,當你給查詢方法一些幫助初始的DOMNode列表減少document.getElementById("list"),但看起來你可以傳遞查詢方法父節點的id的字符串,並實現相同的性能。

query(".odd", "list"); 

再有就是,你可以通過存儲在一個變量的document.getElementById("list")結果緩存的DOMNode列表和重複使用的事實。然而,一般來說,可讀性(在這些微不足道的事情中)往往會勝過性能。考慮到糟糕的JavaScript解釋器可以隱藏的問題的數量,具有可讀代碼可以最終爲您節省很多麻煩。

+0

我明白了,但爲什麼dojo不簡單地使用odds1的乾淨語法,而是調用更有效的賠率2 – Derek 2012-02-15 00:38:14

+0

因此,看着選擇器引擎(http://svn.dojotoolkit.org/src/dojo/trunk/selector /lite.js)它實際上看起來像它一樣。 odd2查詢只適用於ID爲「list」的一個根節點,而odd1查詢可以容納具有公共類值的多個元素(甚至是一個公共的id值,儘管這不是有效的HTML)。我越看越代碼越多,我認爲除了選擇器解析步驟和緩存根節點之外,其他兩者之間沒有任何性能差異。 – 2012-02-15 21:23:08

+0

我一直在閱讀acme.js(http://svn.dojotoolkit.org/src/dojo/trunk/selector/acme.js)選擇器引擎(我認爲這是默認引擎)並且只發生查詢分析在第一次執行查詢時,所以在對低效查詢的後續調用中不存在差別。這個dojo查詢教程在哪裏? – 2012-02-15 21:29:37