2012-02-13 87 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