第一个循环不起作用

first loop not working

本文关键字:不起作用 循环 第一个      更新时间:2023-09-26

我的内部循环似乎工作正常,但是一旦内部循环完成,我希望第一个循环会再次开始,但它没有,我也不清楚为什么......

if(search)
{
    // loop through Revenue Arrangements
    for (var x = 0; search != null && x < search.length; x++)
    {
        var revenue_arrangement = nlapiLoadRecord('revenuearrangement', search[x].getValue(columns[0]));
        nlapiLogExecution('DEBUG', 'Revenue Arrangement Internal ID', search[x].getValue(columns[0]));
        var count = revenue_arrangement.getLineItemCount('revenueelement');
        for (var x = 1; x <= count; x++)
        {
           var rev_element_id = revenue_arrangement.getLineItemValue('revenueelement', 'transactionline', x);               
            if(rev_element_id)
            {
                nlapiLogExecution('DEBUG', 'Element Internal ID', rev_element_id);
            }
        }
  nlapiLogExecution('DEBUG', 'End of Inner Loop);
    }
}

您的两个循环(内部和外部)都使用与计数器相同的变量(x

对两者使用不同的计数器变量

if(search)
{
    // loop through Revenue Arrangements
    for (var x = 0; search != null && x < search.length; x++)
    {
        var revenue_arrangement = nlapiLoadRecord('revenuearrangement', search[x].getValue(columns[0]));
        nlapiLogExecution('DEBUG', 'Revenue Arrangement Internal ID', search[x].getValue(columns[0]));
        var count = revenue_arrangement.getLineItemCount('revenueelement');
        for (var y = 1; y <= count; y++)
        {
           var rev_element_id = revenue_arrangement.getLineItemValue('revenueelement', 'transactionline', y);               
            if(rev_element_id)
            {
                nlapiLogExecution('DEBUG', 'Element Internal ID', rev_element_id);
            }
        }
  nlapiLogExecution('DEBUG', 'End of Inner Loop);
    }
}

您正在重用x变量,嵌套迭代会影响外部变量。这在其他答案中已经清楚地说明过,但让我们将其扩展到您可能不知道的javascript的两个方面,但您应该:

  1. Javascript使用块运算符{}但它没有实现块范围。这意味着 for 循环不会创建新变量范围。如果您来自 c/c++ 背景,这一点很重要。

    查看更多:http://doctrina.org/JavaScript:Why-Understanding-Scope-And-Closures-Matter.html(另请参阅闭包,即外部作用域如何影响嵌套函数作用域)。

  2. Javascript 将变量声明提升到开头函数范围。这意味着两个var x都被有效地声明在问题中包含的代码段的最开头(或可能更早)。

    查看更多:http://www.w3schools.com/js/js_hoisting.asp

    额外的 var 吊装示例,显示了其效果如何怪异:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html


以上意味着您的代码(简化)如下:

var search = ["a","b","c","d"], count;
if(true) {
    for (var x = 0; x < search.length; x++){         
        count = 2;
        for (var x = 1; x <= count; x++){            
           console.log("innner", x)
        }      
        console.log("outer", x)
    }
}

同这个:

var search = ["a","b","c","d"], count, x = 1;
if(true) {
    for (; x < search.length; x++){
        count = 2;
        for (; x <= count; x++){            
           console.log("innner", x)
        }      
        console.log("outer", x)
    }
}

这意味着您不仅有两个相互影响的循环。您还忽略了第一个数组的 0 元素(嵌套循环中的 var x = 1 覆盖var x = 0外部)。

两个代码段都将输出:

innner 1
innner 2
outer 3