javascript代码中的(无限?)循环
我有以下JavaScript代码在网站上“显示”XML: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(
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+"<"+child[i].nodeName+">\n";
if(child[i].hasChildNodes()){ r += createChild(child[i],1); }; // here is where it fails!
r += tabs+"</"+child[i].nodeName+">\n";
}
}
return r;
};
function parseXML(xml){
var doc = new DOMParser().parseFromString(xml,'application/xml');
var node = doc.getElementsByTagName('*')[0];
var r = '';
r += "<<span class=\"highlight highlight-blue\">"+node.nodeName+"</span>>\n";
if(node.hasChildNodes()){ r += createChild(node,1); };
r += "<<span class=\"highlight highlight-blue\">/"+node.nodeName+"</span>>\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";
};