第一个循环不起作用

时间:2016-02-29 12:06:18

标签: javascript netsuite

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

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);
    }
}

2 个答案:

答案 0 :(得分:7)

你的两个循环(内部和外部)使用与计数器(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);
    }
}

答案 1 :(得分:2)

您重复使用x变量,嵌套迭代会影响外部变量。在其他答案中已明确说明了这一点,但让我们将其扩展为指向您可能不知道的javascript的两个方面,但您应该:

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

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

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

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

    额外变量提升示例,显示 bizzare 如何影响其效果:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

  3. 以上意味着您的代码(简化):

    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