javascript代码中的(无限?)循环

javascript代码中的(无限?)循环,javascript,xml,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(

我有以下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);
};
函数createChild(节点,tabindex){
var child=node.childNodes;
var r='';
var标签=“”;

对于(i=0;i这就是为什么您应该始终声明变量的原因:

// declare 'i'
for(var i = 0; i < tabindex ; i++){
  tabs += "\t";
};
//声明'i'
对于(变量i=0;i
如果未在函数范围中声明
i
,则它将是全局的,从而干扰递归函数调用中的
for
循环:

  • i
    变量在第一次函数调用中设置为
    0

  • 该函数是调用自身的

  • i
    变量设置为
    0

  • 函数返回

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


  • 因此,在
    createChild
    函数的某个地方,您必须在第一个循环之前或在第一个循环中声明
    i
    。您还可以使用
    let

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

    // declare 'i'
    for(var i = 0; i < tabindex ; i++){
      tabs += "\t";
    };
    
    //声明'i'
    对于(变量i=0;i
    如果未在函数范围中声明
    i
    ,则它将是全局的,从而干扰递归函数调用中的
    for
    循环:

  • i
    变量在第一次函数调用中设置为
    0

  • 该函数是调用自身的

  • i
    变量设置为
    0

  • 函数返回

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


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

    “我认为其中有一个无限循环,但我不确定”您可以使用调试器,然后您就会知道。当我启动代码时,浏览器会崩溃。我的控制台没有显示任何内容。因此,在代码的第一行上放置一个断点,并停止让它执行…当我删除以下“r+=createChild(child[I],1);”并在控制台中放置一个.log('text')时…我能工作。所以问题显然是createChild函数。但我问这个问题是因为我找不到问题。“我认为其中有一个无限循环,但我不确定”您可以使用调试器,然后您就会知道。当我启动代码时,浏览器会崩溃。我的控制台没有显示任何内容。因此,在代码的第一行上放置一个断点,并停止让它执行…当我删除以下“r+=createChild(child[I],1);”并在控制台中放置一个.log('text')时…我工作。所以问题显然是createChild函数。但我问这个问题是因为我找不到问题。
    // declare 'i'
    for(var i = 0; i < tabindex ; i++){
      tabs += "\t";
    };