我有一个函数,其中有一个调用函数的循环。
function displayItem(item, isChild)
{
if (isChild)
{
writeOutput('<li>' & item.name & '</li>');
}
else
{
writeOutput('<li>' & item.name);
}
try
{
if (item.hasChild)
{
writeOutput('<ul>');
numberOfItems = item.numChildren;
for (x=1;x LT numberOfItems;x++)
{
displayItem(item.child[x], true);
}
writeOutput('</ul>');
}
}
catch(Exception e){}
writeOutput('</li>');
}
执行该函数后,循环继续执行该执行的x值,而不是从之前的位置开始。
例如:x为3. displayItem传递“item.child [3]”并且为true。它通过函数工作,进入循环,执行循环到x = 4,然后退出循环。函数结束并(根据我的理解)返回到x应为3的点。而不是从3中取出,添加一个(使其成为4)然后再次执行循环,它从4中取出(值来自“内部”递归调用循环)。
我知道这听起来不连贯,但我想不出任何其他方式来解释它。
我有什么问题,或者这只是生活中的一个事实,我必须解决这个问题?
更新: 在更多地观察它之后,似乎最早的循环早退出。使用局部变量'x'修复了计数问题,但是如果查看上一个示例,则循环只退出4。它在条件满足之前离开。有什么想法吗?
答案 0 :(得分:7)
您忘了在函数的本地 x 。
不要使用全局变量。 像瘟疫一样避免它们。
答案 1 :(得分:2)
问题在于这一行:
numberOfItems = item.numChildren;
从第二次调用返回时,此值不会更改回正确的值。因此,如果在单独调用函数时将numberOfItems
设置为4,则在完成并返回到函数的原始实例后,numberOfItems
仍然是4。
此代码有效:
function displayItem(item, isChild)
{
var x = 1;
if (isChild)
{
writeOutput('<li>' & item.name & '</li>');
}
else
{
writeOutput('<li>' & item.name);
}
try
{
if (item.hasChild)
{
writeOutput('<ul>');
for (x=1;x LT item.numChildren;x++)
{
displayItem(item.child[x], true);
}
writeOutput('</ul>');
}
}
catch(Exception e){}
writeOutput('</li>');
}
答案 2 :(得分:0)
试试这个
function displayItem(item, isChild)
{
var x = 0;
var numberOfItems = 0;
if (isChild).......................
}