第一个循环不工作
first loop not working
我的内循环似乎工作正常,但一旦内循环完成,我希望第一个循环再次开始,但它没有,我也不清楚为什么...
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 的两个方面,但您应该:
Javascript 使用块运算符 {}
但它没有实现块
范围。这意味着 for 循环不会创建新变量
范围。如果您来自 c/c++ 背景,这很重要。
查看更多:
http://doctrina.org/JavaScript:Why-Understanding-Scope-And-Closures-Matter.html
(另见闭包,即外部作用域如何影响嵌套函数作用域).
Javascript 将变量声明提升到 a 的开头
功能范围。这意味着 var x
都已有效声明
在问题中包含的片段的开头(或
甚至可能更早)。
查看更多:
http://www.w3schools.com/js/js_hoisting.asp
Extra var 提升示例显示了 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
我的内循环似乎工作正常,但一旦内循环完成,我希望第一个循环再次开始,但它没有,我也不清楚为什么...
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 的两个方面,但您应该:
Javascript 使用块运算符
{}
但它没有实现块 范围。这意味着 for 循环不会创建新变量 范围。如果您来自 c/c++ 背景,这很重要。查看更多: http://doctrina.org/JavaScript:Why-Understanding-Scope-And-Closures-Matter.html (另见闭包,即外部作用域如何影响嵌套函数作用域).
Javascript 将变量声明提升到 a 的开头 功能范围。这意味着
var x
都已有效声明 在问题中包含的片段的开头(或 甚至可能更早)。查看更多: http://www.w3schools.com/js/js_hoisting.asp
Extra var 提升示例显示了 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