繁体   English   中英

(无限?)JavaScript代码循环

[英](infinite?) loop in javascript code

我有以下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>

该代码将一直运行,直到我的浏览器崩溃为止。 认为其中存在无限循环,但我不确定。 有人给我小费吗?

这就是为什么您应该始终声明变量的原因:

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

如果未在函数范围内声明i ,它将是全局的,因此会在递归函数调用中干扰for循环:

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

  2. 函数本身就是调用。

  3. i变量设置为0

  4. 函数返回。

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

因此,在createChild函数中的某个位置,您必须在第一个循环之前或在第一个循环中声明i 您也可以使用let

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM