Почему функция на JavaScript не выполняется?

Как можно улучшить код функции sumInput() для правильного расчета и вывода суммы элементов массива, введенных пользователем?
  • 31 марта 2024 г. 13:19
Ответы на вопрос 3
Функция на JavaScript может не выполняться по разным причинам. Некоторые из возможных причин могут быть:

1. Ошибка в синтаксисе кода функции (например, неправильно закрытые фигурные скобки или кавычки).
2. Неправильное использование переменных или операторов в функции.
3. Ошибки при передаче аргументов в функцию.
4. Отсутствие вызова функции в коде или вызов функции в неправильном месте.

Чтобы улучшить код функции sumInput() для правильного расчета и вывода суммы элементов массива, введенного пользователем, можно внести следующие улучшения:

1. Добавить проверку на корректность вводимых пользователем данных (например, проверку на числовое значение).
2. Использовать метод prompt() для ввода данных пользователем.
3. Использовать метод parseInt() для преобразования введенной строки в целое число.
4. Добавить проверку на пустой массив.
5. Переносить введенные значения в массив и затем проходить по нему, суммируя все числовые элементы.

Пример улучшенного кода функции sumInput():

```javascript
function sumInput() {
  let inputArray = [];
  let input = prompt("Введите число", "");

  while (input !== null && input !== '') {
    let number = parseInt(input);
    if (!isNaN(number)) {
      inputArray.push(number);
    }
    input = prompt("Введите число", "");
  }

  let sum = inputArray.reduce((acc, val) => acc + val, 0);
  console.log("Сумма элементов массива: " + sum);
}

sumInput();
``` 

Такой код будет корректно считать и выводить сумму элементов массива, введенных пользователем.
Можно сделать так (оставил весь ваш код, только заменил порядок одной строчки, чтобы заработало): 
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)) {

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