我正在尝试创建一个函数,该函数返回传入数字以下所有 3 或 5 倍数的总和。我立即意识到与“FizzBuzz”的相似之处。这是第一个代码战挑战。我创建了两个经过测试的函数,它们独立工作,但我不知道如何在内部函数 returnNumber中引用外部函数 solution() 的参数em>。每次尝试运行该函数时,我都会得到 0 的答案。
function solution(number){
function returnNumbers(number){
let numbers=[];
for (let i=1; i<number; i++){
if (i % 3 == 0 && i % 5 == 0) numbers.push(i);
else if (i % 3 == 0) numbers.push(i);
else if (i % 5 == 0) numbers.push(i);
} //end of for loop
return numbers
} //end of returnNumbers
let sum = returnNumbers().reduce(function(a, b){
return a + b;
}, 0);
return sum
} //end of solution
我已经尝试为原始参数分配一个新变量,但可能我没有正确执行。像这样:
function solution(number){
let x = number
function returnNumbers(x){
let numbers=[];
for (let i=1; i<x; i++){
if (i % 3 == 0 && i % 5 == 0) numbers.push(i);
else if (i % 3 == 0) numbers.push(i);
else if (i % 5 == 0) numbers.push(i);
} //end of for loop
return numbers
} //end of returnNumbers
let sum = returnNumbers().reduce(function(a, b){
return a + b;
}, 0);
return sum
}
我认为解决方案很简单,但我是一个绝对的初学者(< 3 周),所以我希望得到一些帮助。
答案 0 :(得分:1)
您面临的主要问题是范围 - 变量仍然“存在”多长时间。要意识到的主要事情是外部函数中的任何内容仍然在内部函数的作用域内,只要您不声明同名的变量(当您这样做时,外部变量被遮蔽 em> - 它仍然存在,你只是无法访问它,因为当你使用那个名字时,你会得到内部的名字)。
所以,你的第一个解决方案是正确的,只是你不需要函数的参数:
function returnNumbers(number){
应该是
function returnNumbers(){
因为 number 已经在范围内,但是如果您将其声明为参数,则需要传递它(但在这种情况下毫无意义)。
答案 1 :(得分:0)
调用 returnNumbers
函数时,参数没有被传递。尝试将外部函数值传递给它。
let sum = returnNumbers(number).reduce(function(a, b){
return a + b;
}, 0);
答案 2 :(得分:0)
您的内部函数已经可以访问外部函数的参数(因为它位于外部函数的括号内)。因此,在您的情况下,returnNumbers
可以已经使用 number
而无需将其作为参数传递。
通过将其声明为 returnNumbers
的参数,您就是 shadowing number
变量。您有两种可能的解决方案。
要么将 number
传递给 returnNumbers
let sum = returnNumbers(number).reduce(function(a, b){
return a + b;
}, 0);
或者删除returnNumbers
参数
function returnNumbers(){
...
}