Могу ли я привести внешний аргумент так же, как и внутренний аргумент?

#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(){
...
}