为什么这个DOM DFS算法不起作用?

时间:2016-07-06 16:19:31

标签: javascript html algorithm dom depth-first-search

我尝试下面的算法DFS DOM树,但它不起作用!它可以只检查DOM树中的第一个路径。为什么?!

function DFS(P) // (ScanRegion, Elem, MCF)
{
    P.Elem.setAttribute("Checked", "1");

    Children = P.Elem.querySelectorAll("*");

    for(I = 0, L = Children.length; I < L; I++)
        DFS
        (
            {
                ScanRegion : P.ScanRegion,
                Elem       : Children[I] ,
                MCF        : P.MCF
            }
        );

    return;
}

DFS
(
    {
        ScanRegion : document.body,
        Elem       : document.body,
        MCF        : "Not important in this question :D"
    }
);
经过几天的调试后我终于发现了问题。我尝试了下面的代码并理解,在函数丰富到DOM树的第一个叶子并且浏览器运行递归函数的第一个'return'之后,父函数的'L'变量失去其值并变为' 0' 。我猜这是因为JS中的变量范围问题,因为你知道子函数的'L'是'0'(因为叶子没有子:D),我认为它会影响父函数。

这是我试过的调试代码:

function DFS(P) // (ScanRegion, Elem, MCF)
{
    P.Elem.setAttribute("Checked", "1");

    Children = P.Elem.querySelectorAll("*");

    L = Children.length; alert(L); // * New

    for(I = 0; I < L; I++)
        DFS
        (
            {
                ScanRegion : P.ScanRegion,
                Elem       : Children[I] ,
                MCF        : P.MCF
            }
        );

    alert(L); // * New

    return;
}

DFS
(
    {
        ScanRegion : document.body,
        Elem       : document.body,
        MCF        : "Not important in this question :D"
    }
);

如果有人知道问题或者有真正的代码,我将不胜感激:)

1 个答案:

答案 0 :(得分:1)

使用var声明您的本地变量!!目前,I全球。与L相同。因此,递归调用会扰乱父代的迭代。

添加

var I, L;

到函数的顶部。 (还可以考虑使用小写字母表示变量名称;它在JavaScript代码中更常见。)