#javascript
Вопрос:
Я пытаюсь создать функцию, которая возвращает сумму всех кратных 3 или 5 ниже переданного числа. Я сразу распознал сходство с «ФиззБузз». Это первый вызов codewars. Я создал две функции, которые я протестировал, и они работают независимо, но я не могу понять, как ссылаться на аргумент внешней функции solution() в моей внутренней функции returnNumber. Каждый раз, когда я пытаюсь запустить функцию, я получаю ответ 0.
function solution(number){
function returnNumbers(number){
let numbers=[];
for (let i=1; i<number; i ){
if (i % 3 == 0 amp;amp; 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 amp;amp; 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
}
Я полагаю, что решение простое, но я абсолютный новичок (
Комментарии:
1. Вы не передаете
x
ценность, попробуйтеlet sum = returnNumbers(x).reduce(function(a, b){ return a b; }, 0);
Ответ №1:
Основная проблема, с которой вы сталкиваетесь, — это область действия-как долго переменная все еще «существует». Главное понимать, что ничего во внешнем функция все еще находится в области внутренней функции, пока вы не объявите переменную с тем же именем (в этом случае внешняя переменная тень — она по-прежнему существует, вы просто не сможете получить к нему доступ, потому что, когда вы используете это имя вы будете получать внутренний).
Итак, ваше первое решение является правильным, за исключением того, что вам не нужно иметь аргумент для функции:
function returnNumbers(number){
должно быть просто
function returnNumbers(){
потому что число уже находится в области видимости, но если вы объявите его в качестве аргумента, вам нужно будет передать его (но в данном случае это бессмысленно).
Комментарии:
1. Спасибо за быструю передышку, Дэйв, это сработало и очень полезно!
Ответ №2:
при вызове returnNumbers
функции аргумент не передается. Попробуйте передать ему значение внешней функции.
let sum = returnNumbers(number).reduce(function(a, b){
return a b;
}, 0);
Ответ №3:
Ваша внутренняя функция уже имеет доступ к параметру внешней функции (потому что он находится внутри скобок внешней функции). Так что в вашем случае returnNumbers
вы уже можете использовать number
его без передачи в качестве параметра.
Объявляя его в качестве параметра для returnNumbers
, вы затеняете number
переменную. У вас есть два возможных решения.
Либо переходите number
к returnNumbers
let sum = returnNumbers(number).reduce(function(a, b){
return a b;
}, 0);
Или удалить returnNumbers
параметр
function returnNumbers(){
...
}