2016-02-29 75 views
1

我内在的循环似乎工作正常,但一旦内循环完成我预计第一批循环再次启动,但它没有,它不是很清楚,我为什么...第一循环不工作

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

你是否检查了JS控制台的任何错误?还请注意,您的复制/粘贴片段有一个错字(缺少结尾报价:“End of Inner Loop”) – SidOfc

+0

谢谢 - 修复错字 – MG2016

回答

2

你重用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

    额外变种吊装例子展示了如何的bizzare可以是它的效果: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 
+0

感谢您的链接 - 现在应该阅读! – MG2016

+0

由于内部循环遍历NetSuite子列表,所以1是正确的起始索引。 – erictgrubaugh

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

感谢您的超快反应 - 我现在可以停止拉出头发! – MG2016