Почему не работает функция js?

Ссылка скопирована
1 ответ

У меня есть такая задача:

Напишите функцию sumInput(), которая:

Просит пользователя ввести значения, используя prompt и сохраняет их в массив.
Заканчивает запрашивать значения, когда пользователь введёт не числовое значение, пустую строку или нажмёт «Отмена».
Подсчитывает и возвращает сумму элементов массива.
P.S. Ноль 0 – считается числом, не останавливайте ввод значений при вводе «0».

Вот код который я написал:

function sumInput() { 	let arr = [] 	let sum = 0 	function checkNum() { 		let numVal = +prompt('Введите значение', '') 		if (!isNaN(numVal)) { 			checkNum() 			arr.push(numVal) 			console.log(arr) 		} else { 			for (let i = 0; i < arr.length; i++) { 				sum += arr[i] 			} 			console.log(sum) 		} 	} 	checkNum() }

function sumInput() { let arr = [] let sum = 0 function checkNum() { let numVal = +prompt('Введите значение', '') if (!isNaN(numVal)) { checkNum() arr.push(numVal) console.log(arr) } else { for (let i = 0; i < arr.length; i++) { sum += arr[i] } console.log(sum) } } checkNum() }

В ответ выводит undefined, вместо суммы элементов в массиве

Дополнительно:

В ответ выводит undefined

В каком месте? У тебя в обоих логах андефайт в принципе быть не может.

Можно сделать так (оставил весь ваш код, только заменил порядок одной строчки, чтобы заработало):

function sumInput() { 	let arr = [] 	let sum = 0 	function checkNum() { 		let numVal = +prompt('Введите значение', '') 		if (!isNaN(numVal)) { //			checkNum()           // было так 			arr.push(numVal)  // добавляем элемент в массив 			console.log(arr) 			checkNum()         // только после этого вызываем функцию checkNum 		} else { 			for (let i = 0; i < arr.length; i++) { 				sum += arr[i] 			} 			console.log(sum) 		} 	} 	checkNum() }

function sumInput() { let arr = [] let sum = 0 function checkNum() { let numVal = +prompt('Введите значение', '') if (!isNaN(numVal)) { // checkNum() // было так arr.push(numVal) // добавляем элемент в массив console.log(arr) checkNum() // только после этого вызываем функцию checkNum } else { for (let i = 0; i < arr.length; i++) { sum += arr[i] } console.log(sum) } } checkNum() }

Код не работал потому что "вся полезная работа" откладывалась из за преждевременного вызова checkNum. А поскольку вызов рекурсивный, то сложно заметить такую ошибку и вообще понять что происходит в коде. Но в принципе ваш подход рабочий.

То что в консоли бывает undefined - это потому что основная функция sumInput ничего не возвращает явно (нет return). Но такие функции в JS всё же возвращают значение, просто оно не определено - undefined.

P.S.: Чтобы выполнить остальные условия из задания (пуcтая строка, кнопка Отмена), можно сделать так:

let val = prompt('Введите значение', '');  // сохраняем оригинальное значение let numVal = Number(val);   // приводим тип к числу, можно и через +val, как у вас /* расширяем условие проверки полученного значения 1. Если приведённая к типу число переменная не является числом 2. И если переменная не null (так будет в случае нажатия Отмена) 3. И если тип оригинального значения - строка и после удаления пробелов сохраняет длину (не пустая строка) */ if (!isNaN(numVal) && (val !== null) && (typeof val == 'string' && val.trim().length)) {

let val = prompt('Введите значение', ''); // сохраняем оригинальное значение let numVal = Number(val); // приводим тип к числу, можно и через +val, как у вас /* расширяем условие проверки полученного значения 1. Если приведённая к типу число переменная не является числом 2. И если переменная не null (так будет в случае нажатия Отмена) 3. И если тип оригинального значения - строка и после удаления пробелов сохраняет длину (не пустая строка) */ if (!isNaN(numVal) && (val !== null) && (typeof val == 'string' && val.trim().length)) {

Всё это можно красивее написать, но потребуется сильнее изменить структуру кода.

Ответы:

1. Зачем нужен рекурсивный вызов checkNum?
2. При нажатии кнопки "Отмена" возвращается null, а +null === 0.
3. Массив тут не нужен. Совсем не нужен.

  • это задача из книги learnJS на тему массивы
  • 1. Зачем нужен рекурсивный вызов checkNum?

    Чтобы повторно вызывать prompt и всю остальную логику для условия задачи.
    Есть идеи как это сделать без рекурсии?
    Можно while(true) с break по условию или что то ещё.
    Но чем это лучше рекурсии? Стек не переполнится? Нет лишних вызовов функции? - Всё так, но для этой задачи не принципиально.

    По номеру 2 вы правы.
    А вот массив нужен по условию задачи.

  • justaoneuser, цикл гораздо проще и нагляднее рекурсии. В данном случае вы уходите в рекурсию не изменив массива и, когда получаете завершающий элемент, массив у вас пустой. В результате получаем:
    0 // вывод суммы пустого массива Array [ 3 ]    // вывод массива в обратном порядке Array [ 3, 2 ] // при развёртывании рекурсии Array(3) [ 3, 2, 1 ] undefined // результат работы функции sumInput(),           //поскольку она ничего не возвращает

    0 // вывод суммы пустого массива Array [ 3 ] // вывод массива в обратном порядке Array [ 3, 2 ] // при развёртывании рекурсии Array(3) [ 3, 2, 1 ] undefined // результат работы функции sumInput(), //поскольку она ничего не возвращает

  • Rsa97, да всё так. Просто хотел уточнить что с рекурсией тоже можно.
    Почему то многие избегают рекурсии в принципе, даже в задачах где код с ней получается проще и короче.
    Это, конечно, не тот случай. Но если хочется поиграться с рекурсивными функциями - ничего страшного, наоборот может пригодиться позже.
  • Rsa97,

    цикл гораздо проще и нагляднее рекурсии.

    Я бы поспорил с этим утверждением.) Вот вообще не всегда именно проще и лучше. Но в данном случае да, поддерживаю.

const sumInput = (input = +prompt('Введите значение', ''), sum = 0) => (!!input && typeof(input) !== 'string') ? (sum += input, sumInput(+prompt('Введите значение', ''), sum)) : sum;   console.log(sumInput());

const sumInput = (input = +prompt('Введите значение', ''), sum = 0) => (!!input && typeof(input) !== 'string') ? (sum += input, sumInput(+prompt('Введите значение', ''), sum)) : sum; console.log(sumInput());

  • Прикольно, но без массива.
    Вот так ещё можно:
    const sumInput = (arr = []) => ((val, numVal) => val !== null && !isNaN(numVal) && val.trim().length ? sumInput([...arr, numVal]) : arr.reduce((a, b) => a + b))(val = prompt('', ''), Number(val))

    const sumInput = (arr = []) => ((val, numVal) => val !== null && !isNaN(numVal) && val.trim().length ? sumInput([...arr, numVal]) : arr.reduce((a, b) => a + b))(val = prompt('', ''), Number(val))

    Можно убрать вложенную анонимную функцию, но вообще смысл этих заданий чтобы разобраться с конкретной темой, на сколько понимаю, в данном случае с массивами. А вот такой однострочник со стрелочными функциями как у вас (или у меня) не способствует этой цели. А только запутывает в JS-синтаксисе, который не сказать что простой слишком.

  • justaoneuser,

    Моё решение логически верное, нет смысла заполнять массив и считать сумму элементов, достаточно посчитать сумму и вернуть её.

    Додумывать что-то за непонятно кем, что он там подразумевал, чему хотел научить - да мне плевать, честно.
    Есть задача - есть решение, если задача некорректная, корректируется задача, а не адаптируется решение к ней.

    Мне несколько лет назад отвечали на мой вопрос так, чтобы я увидел (или разобрался) как нужно, а не как я хочу. - благодаря этому и не только я знаю столько, сколько я знаю сейчас.

    const sumInput = (input = +prompt('', ''), sum = 0, arr = []) => (!!input && typeof(input) !== 'string') ? (arr.push(input), sumInput(+prompt('', ''), 0, arr)) : arr.reduce((a, c) => a + c);

    const sumInput = (input = +prompt('', ''), sum = 0, arr = []) => (!!input && typeof(input) !== 'string') ? (arr.push(input), sumInput(+prompt('', ''), 0, arr)) : arr.reduce((a, c) => a + c);

  • historydev, логически верно и на SQL посчитать, например. Но это не соответствует условиям задачи.
    В том то и дело, что "как нужно" - это хранить числа в массиве. Остальное - уже фантазии на тему.

    Понимаете, решить экзотическим способом можно, но вопрос у автора был не про code golf, а ну немного другой был вопрос.

    А так, вот:

    const sumInput = (arr = [], fn = () => prompt('', ''), val = fn()) => val && !val.match(/[^d]/g) ? sumInput([...arr, +val], fn, fn()) : arr.reduce((a, b) => a + b);

    const sumInput = (arr = [], fn = () => prompt('', ''), val = fn()) => val && !val.match(/[^d]/g) ? sumInput([...arr, +val], fn, fn()) : arr.reduce((a, b) => a + b);

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Алексей Денисов Ответ

Для того чтобы понять, почему функция JavaScript не работает, необходимо провести некоторые проверки и анализировать код.

1. Проверьте синтаксис: убедитесь, что все скобки, точки с запятой, кавычки и другие символы используются правильно. Ошибки в синтаксисе могут привести к неработающему коду.

2. Проверьте консоль: откройте консоль браузера (обычно нажатием F12) и посмотрите наличие ошибок. Ошибки в консоли могут помочь вам понять, что именно идет не так.

3. Проверьте пути к файлам: если ваш скрипт подключается из внешнего файла, убедитесь, что путь к нему указан правильно. Неправильный путь может привести к тому, что скрипт не будет загружен.

4. Проверьте порядок выполнения: убедитесь, что функция вызывается после загрузки всех необходимых элементов страницы. Иногда JavaScript функции не срабатывают из-за того, что элементы, с которыми они работают, еще не загружены.

5. Проверьте блокировщики рекламы: некоторые расширения для браузера или программы блокировки рекламы могут блокировать выполнение JavaScript кода. Попробуйте отключить их и проверить работу функции.

Вот пример кода на JavaScript, который может помочь вам отловить ошибки:

    function myFunction() {
        console.log("Функция сработала успешно!");
    }
 
    window.onload = function() {
        myFunction();
    };

function myFunction() { console.log("Функция сработала успешно!"); } window.onload = function() { myFunction(); };

Проверьте вышеперечисленные пункты и исправьте любые ошибки, которые найдете. Надеюсь, эти советы помогут вам разобраться с проблемой и заставить вашу функцию JavaScript работать.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно