【问题标题】:How do I return a variable from nested For Loops in JavaScript without using a global variable?如何在不使用全局变量的情况下从 JavaScript 中的嵌套 For 循环返回变量?
【发布时间】:2021-03-17 10:45:55
【问题描述】:

这是我的无输入代码

// Check if three addends equal sum and return the product if so
let result;
function addNumbers(first,second,third,sum) {
    if (first + second + third === sum) {
        result = first * second * third;
        return (first * second * third);
    }
};

// find three numbers in list that add up to specific number
function testResult(list,sum) {
    let firstAddend;
    let secondAddend;
    let thirdAddend;
    for (let i = 0; i < list.length; i++) {
        firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                thirdAddend = list[k];
                addNumbers(firstAddend,secondAddend,thirdAddend,sum);
            }
        }
    }
};

我想要的是testResult() 在返回产品时从addNumbers() 返回结果。我想摆脱addNumbers() 中的let result;result = ...。我一直对范围感到困惑,但我想我开始明白了。每个for 循环是否包含前一个循环的范围?如果有人感兴趣,这是来自代码出现的第 1 天。我不确定这里是否需要数据。如果是让我知道,我会相应地编辑。

【问题讨论】:

  • 不清楚你在哪里使用result。另外,您说您希望testResult 返回一些东西,但它没有return 声明?我怀疑你正在寻找类似const result = addNumbers(firstAddend,secondAddend,thirdAddend,sum); 的东西,然后在最里面的循环中做更多的事情并得到结果(例如if (result === undefined) …)。
  • 请使用 map、filter 和 reduce 数组方法而不是 for 循环。代码将更具可读性
  • 顺便说一句,你可能不应该做firstAddend = list.shift();,而是firstAddend = list[i]。如果要避免ijk 选择相同的元素,请使用for (let j=i+1; j&lt;…for (let k=j+1; k&lt;…
  • @captain-yossarian 更简洁,是的。更具可读性,不一定,尤其是对于刚刚学习循环的初学者来说。而map/filter/reduce实际上是错误的工具,你需要slicefind
  • 谢谢@Bergi。我更改了迭代器并摆脱了l.shift(),这是有道理的。如何使用slicefind 来解决这个问题?

标签: javascript for-loop scope return


【解决方案1】:

每个for 循环是否包含前一个循环的范围?

是的,确实如此。每当您创建子作用域时,前一个作用域中的所有变量都可用。因此,您实际上不必提前声明 firstAddendsecondAddendthirdAddend

function testResult(list,sum) {
    for (let i = 0; i < list.length; i++) {
        let firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            let secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                let thirdAddend = list[k];
                addNumbers(firstAddend,secondAddend,thirdAddend,sum);
            }
        }
    }
}

接下来,return 表示当您调用该函数时,它会采用您返回的值。因此,您不需要全局 result 变量,因为您可以只使用返回值。但是,您应该将if 语句从addNumbers 函数中移到testResult 函数中,因为您需要知道何时返回,而不仅仅是返回什么。事实上,addNumbers 函数就足够了,它应该直接进入testResult

function testResult(list,sum) {
    for (let i = 0; i < list.length; i++) {
        let firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            let secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                let thirdAddend = list[k];
                if (firstAddend + secondAddend + thirdAddend === sum) {
                    return firstAddend * secondAddend * thirdAddend;
                }
            }
        }
    }
}

为了练习,如果你想要这个功能,你可以做如下的事情:

function addNumbers(first,second,third,sum) {
    if (first + second + third === sum) {
        return (first * second * third);
    } else {
        return null; // return some value so the calling function knows that no sum was found
    }
}

function testResult(list,sum) {
    for (let i = 0; i < list.length; i++) {
        let firstAddend = list.shift();
        for (let j = 0; j < list.length; j++) {
            let secondAddend = list[j];
            for (let k = 1; k < list.length; k++) {
                let thirdAddend = list[k];
                let result = addNumbers(firstAddend, secondAddend, thirdAddend, sum);
                if (result !== null) {
                    return result;
                }
            }
        }
    }
}

【讨论】:

  • 这样就搞清楚了范围。感谢您的详细解答和解释!
猜你喜欢
  • 2018-12-15
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多