(无限?)循环javascript代码

时间:2017-08-03 15:32:40

标签: javascript xml

我有以下JavaScript代码在网站上“显示”XML:

function createChild(node,tabindex){

    var child = node.childNodes;

    var r = '';

    var tabs = '';

    for(i=0;i<tabindex;i++){

        tabs += "\t";

    };

    for(i=0;i<child.length;i++){

        if(child[i].nodeType == 1){

            r += tabs+"&lt;"+child[i].nodeName+"&gt;\n";

            if(child[i].hasChildNodes()){ r += createChild(child[i],1); }; // here is where it fails!

            r += tabs+"&lt;/"+child[i].nodeName+"&gt;\n";

        }

    }

    return r;

 };


function parseXML(xml){

    var doc = new DOMParser().parseFromString(xml,'application/xml');

    var node = doc.getElementsByTagName('*')[0];

    var r = '';

    r += "&lt;<span class=\"highlight highlight-blue\">"+node.nodeName+"</span>&gt;\n";

    if(node.hasChildNodes()){ r += createChild(node,1); };

    r += "&lt;<span class=\"highlight highlight-blue\">/"+node.nodeName+"</span>&gt;\n";

    $('.viewer').html(r);
};

这样可以在XML上正常工作:

<properties>
    <property></property>
</properties>

但是当这样的孩子不止一个时,它就无法工作:

<properties>
    <property>
        <value></value>
    </property>
</properties>

代码一直运行,直到我的浏览器崩溃。我认为中有一个无限循环,但我不确定。有没有人给我一个提示?

1 个答案:

答案 0 :(得分:3)

这就是始终声明变量的原因:

// declare 'i'
for(var i = 0; i < tabindex ; i++){
  tabs += "\t";
};

如果你没有在函数范围内声明i,它将是全局的,从而干扰递归函数调用中的for循环:

  1. 第一次函数调用中i变量设置为0

  2. 该功能自行调用。

  3. i变量设置为0

  4. 该函数返回。

  5. i现在再次0,因此第一帧中的循环将永远运行。

  6. 所以createChild函数中的某个地方,你必须在第一个循环之前或第一个循环中声明i。您也可以使用let

相关问题