Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 22.10.2010
Сообщений: 30

Не понятная работа return в функции

07.01.2020, 17:49. Показов 1077. Ответов 2

Студворк — интернет-сервис помощи студентам
Здравствуйте, написал программу по отгадыванию числа. Программа генерирует рандомное число, пользователь пытается его отгадать вводя свое число, программа сравнивает и возвращает ему результат в виде - "больше", "меньше" или "правильно". Так же если пользователь вводит не число то программа снова выдает приглашение для ввода, если пользователь нажимает отмена то работа программы завершается.
Проблема в том что есть баг в котором я не могу разобраться, когда ввожу пустую строку программа запрашивает снова число, я нажимаю "Отмена" и после этого "return alert('Вы нажали "Отмена".');" не завершает функцию и не возвращает undefined, программа переходит к 17й строке на просто retirn; и значение null преобразуется в 0 и функция "getUserNumber" возвращает 0 и выполняется сравнение с нулем, хотя я ожидаю что сравнение будет с undefined тем самым выполнение программы закончится.
К слову если сразу нажимать "Отмена" или перед этим пытаться вводить цифры или буквенные символы то "Отмена" срабатывает как надо.
Помогите пожалуйста разобраться почему программа себя так ведет.

Код:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"use strict";
 
const MAX_RANDOM_NUMBER = 100;
const getRandomNumber = number => Math.floor(Math.random() * number);
const isCancel = number => number === null;
const isNumber = number => !isNaN(parseFloat(number)) && isFinite(number);
 
function getUserNumber() {
  let userInput = prompt('Введите число!', );
  //console.log(typeof(+userInput) + " " + typeof(userInput) + " - " + userInput);
  if (isCancel(userInput)) {
    return alert('Вы нажали "Отмена".');
  }
  if ( !isNumber(userInput) ){
    getUserNumber();
  }
  return Number(userInput);
}
 
function comparison(randomNumber, userNumber) {
  if (randomNumber > userNumber){
    alert("Меньше!");
    comparison(randomNumber, getUserNumber());
  }
  if (randomNumber < userNumber){
    alert("Больше!");
    comparison(randomNumber, getUserNumber());
  }
  if (randomNumber === userNumber){
    alert("Правильно!");
  }
}
 
comparison(getRandomNumber(MAX_RANDOM_NUMBER),getUserNumber());
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2020, 17:49
Ответы с готовыми решениями:

Не понятная работа anyconnectVPN
Здравствуйте, Уважаемые. Настроил SSL VPN на CISCO ASA (по статье http://www.go-to-easyit.com/2011/11/ssl-vpn-webvpn-cisco-asa-2.html) ...

Не понятная работа Цикла
Здравствуйте! Прошу помочь с циклом. Не могу понять что делаю не так. Есть две &quot;умные таблицы&quot; (Header и Footer), каждая из...

Не понятная работа php, mysql and json
Здравствуйте, разрабатываю мобильное приложение, которое должно получать данные из БД. Я долго разбирался с тем, как настроить подключение...

2
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
07.01.2020, 19:03
MrPerec, потому что
JavaScript
1
2
isCancel(пустая строка) === false(0)
Number(null) === 0
Далее алгоритм отрабатывает Вашу логику
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function getUserNumber() {
  let userInput = prompt('Введите число!', ); // пустая строка 
  //console.log(typeof(+userInput) + " " + typeof(userInput) + " - " + userInput);
  if (isCancel(userInput)) { //isCancel(пустая строка) === false; посему  дальше отрабатывает следующий if
    return alert('Вы нажали "Отмена".');
  }
// так как alert модалка, она препятствуют получению пользователем доступа к другим частям страницы до тех пор, пока окно не будет закрыто. По этой причине такая путаница с их выдачей.
// после путаницы как раз наступает момент когда срабатывает участок ниже и функция comparison
  if ( !isNumber(userInput) ){
    getUserNumber();
  }
  return Number(userInput);
}
1
1 / 1 / 1
Регистрация: 22.10.2010
Сообщений: 30
10.01.2020, 07:47  [ТС]
Спасибо за ответ. Немного подкорректировал код, сейчас все заработало как надо.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
"use strict";
 
const MAX_RANDOM_NUMBER = 100;
const getRandomNumber = number => Math.floor(Math.random() * number);
const isCancel = number => number === null;
const isNumber = number => !isNaN(parseFloat(number)) && isFinite(number);
 
function getUserNumber() {
  let userInput = prompt('Введите число!', );
  if ( isNumber(userInput) ){
    return Number(userInput);
  }
  if (isCancel(userInput)) {
    return alert('Вы нажали "Отмена".');
  }
  getUserNumber();
}
 
function comparison(randomNumber, userNumber) {
  if (randomNumber > userNumber){
    alert("Меньше!");
    comparison(randomNumber, getUserNumber());
  }
  if (randomNumber < userNumber){
    alert("Больше!");
    comparison(randomNumber, getUserNumber());
  }
  if (randomNumber == userNumber){
    alert("Правильно!");
  }
}
 
comparison(getRandomNumber(MAX_RANDOM_NUMBER),getUserNumber());
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2020, 07:47
Помогаю со студенческими работами здесь

Что это isOk(int s),setAge(int g){if(isOk(g){age=g;return true;}else{.;return false;}}.getName(){return name;}?
package com.company; import java.io.Serializable; public class person implements Serializable { protected String name; ...

Работа return
Объясните, пожалуйста, как в данных примерах работает return. class Figure { ///////////// public virtual bool Check(int...

return в функции
Почему в этой функции результат выдается 20, что и надо, но если мы переместим (см фунцию b) return внутрь цикла, ответ будет ноль?? ...

Return в функции
Можно ли запись упростить: var b=0; b=add(b); alert(b); function add(i){ i++; return i; }

return в функции потока
Куда возвращается значение, указанное в return функции созданного потока?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru