javascript - 如何在不使用全局变量的情况下从 JavaScript 中的嵌套 For 循环返回变量?
问题描述
这是我的无输入代码
// 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()
返回产品时返回结果。我想摆脱let result;
和result = ...
在addNumbers()
. 我一直对范围感到困惑,但我想我开始明白了。每个for
循环是否包含前一个循环的范围?如果有人感兴趣,这是来自代码出现的第 1 天。我不确定这里是否需要数据。如果是让我知道,我会相应地编辑。
解决方案
每个
for
循环是否包含前一个循环的范围?
是的,它确实。每当您创建子作用域时,前一个作用域中的所有变量都可用。因此,您实际上不必提前声明firstAddend
and :secondAddend
thirdAddend
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;
}
}
}
}
}
推荐阅读
- java - 如何在两个 PCollection 上追加新行或执行联合
- angular - 如何在模块文件中导入 Ng-material-floating-button?
- javascript - Firebase - 实时数据库规则:如何允许所有登录用户写入一个区域
- html - 如何等待从 SQL 报告服务访问 URL 下载文件?
- scala - Scala/Spark 将日期时间更改为 EpochTime 格式
- python - 循环通过 API:下一个条目字段 (Python)
- javascript - 如何将道具传递给 React 中的另一个组件?
- cloudflare - 提前退出 Cloudflare HTMLReWriter
- javascript - Nginx 无法处理文件 10+ mb 文件上传
- docker - Dockerizing Go API 在不设置 git 项目 repo 的情况下无法工作