2012-02-13 3 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")); 

을보고 그들은 odds1보다 빠른 odds2이라고 설명했다 #list의 DOM보다는 전체의 HTML DOM에서 .odd에 대한 odds2 검색 때문이다. 내가 궁금한 건 odds1 (클리너 코드가 아닌)을하는 것의 장점은 무엇입니까? 쿼리가 id 요소 내의 객체를 검색하는 경우에는 odds2 스타일이 항상 사용되어야합니다 (올바른 id, 클래스 html 사용이라고 가정). 그렇다면 dojo가 자동으로 odds1에서 쿼리 문자열을 호출하여 호출하도록 호출해야합니다. 승률 2?

답변

2

쿼리 (은 쿼리 용이고 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의 깨끗한 구문을 사용하지만 더 효율적인 odds2를 호출하지는 않는다. – Derek

+0

그래서 선택기 엔진 (http://svn.dojotoolkit.org/src/dojo/trunk/selector)을보고있다. /lite.js) 실제로 그렇게 보이는 것처럼 보입니다. odd2 쿼리는 id가 "list"인 루트 노드가 하나만있는 경우에만 작동하지만 odd1 쿼리는 공통 클래스 값 (또는 유효한 HTML이 아닐지라도 공통된 id 값)을 가진 여러 요소를 수용 할 수 있습니다. 코드를 자세히 살펴볼수록 선택기 구문 분석 단계와 루트 노드 캐싱 외의 두 가지 성능 차이가 없다고 생각합니다. –

+0

저는 acme.js (http://svn.dojotoolkit.org/src/dojo/trunk/selector/acme.js) 선택기 엔진 (기본 엔진이라고 생각합니다)을 읽었으며 쿼리 구문 분석 만 발생합니다 처음으로 쿼리가 실행될 때 비효율적 인 쿼리에 대한 이후의 호출에 차이점이 없기 때문입니다. 이 도장 쿼리 튜토리얼은 어디에 있습니까? –

관련 문제