ルートノードを使用する理由。以下の関数では、ルートノード関数を使用しています。この関数についても、「!rootNode」の意味を理解したいと思います。
function getElementsByClassName(cn, rootNode) {
if (!rootNode) {
rootNode = document;
}
for (var r=[], e=rootNode.getElementsByTagName('*'), i=e.length; i--;) {
if ((' '+e[i].className+' ').indexOf(' '+cn+' ')>-1) {
r.push(e[i]);
}
}
return r;
}