Вызов функций, не работающих должным образом

#javascript #function #recursion

#javascript #функция #рекурсия

Вопрос:

Я работаю над проектом в области компьютерных наук, мне нужно создать игру «Колесо фортуны» — в основном, получить случайное слово, показать пробелы и попросить игрока (игроков) угадать буквы, чтобы сформировать слово. Прямо сейчас у меня есть части, в которых слово выбрано, скрыто (замена букв на пробелы) и показано. Теперь я со стороны включаю проигрыватель, чтобы начать угадывать буквы. Я настроил кнопку для вызова функции, которая вызывает другие функции (каждый ход разбивается на несколько частей, например, запрашивает предположение, проверяет, какой тип предположения это, и проверяет, есть ли это предположение в слове). По какой-то причине эта более крупная функция при их вызове вызывает только первую функцию и рассылает спам по этой единственной функции. Почему он не идет вниз по списку функций и не вызывает каждую по порядку?

Вот код, который относится к этой части:

 function player1() {
  console.log("Player 1 is going.");
  nowGoing = 1;
  player1Elements.style.display = "block";
  alert(player1Name   " it is your turn. What do you guess?");
  prompt();
  checkGuessType();
  checkGuess();
}

function prompt() {
  console.log("Prompting");
  var playerGuess;
  playerGuess = prompt("What letter would you like to guess?");
  checkGuessType(playerGuess);
}

function checkGuessType(playerGuess) {
  console.log("Checking");
  if (playerGuess.length > 1) {
    console.log(player1Name   " guessed a word.");
  } else if (playerGuess == "a" || playerGuess == "e" || playerGuess == "i" || playerGuess == "o" || playerGuess == "u") {
    console.log(player1Name   " guessed a vowel.");
  } else {
    console.log(player1Name   " guessed a consonant.");
  }
} 

Все, что отображается в консоли (консоль.журналы предназначены именно для этой цели) — это 6000 строк с надписью «Запрос», а не «Запрос» и «Проверка». Если есть еще какой-то код, который я должен показать, пожалуйста, дайте мне знать!

Если бы кто-нибудь мог мне помочь, это было бы здорово!

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

 function player1() {

  console.log("Player 1 is going.");
    nowGoing = 1;
    player1Elements.style.display = "block";
    
    alert(playerName1   " it is your turn. What do you guess?");
  prompt();
  checkGuessType();
  checkGuess();

}

function prompt() {

    // console.log("Prompting");
    
    playerGuess = prompt("What letter would you like to guess?");

}

function checkGuessType() {

    console.log("Checking");

  if (playerGuess.length > 1) {

    console.log(playerName1   " guessed a word.");

  } else if (playerGuess == "a" || playerGuess == "e" || playerGuess == "i" || playerGuess == "o" || playerGuess == "u") {

    console.log(playerName1   " guessed a vowel.");

  } else {

    console.log(playerName1   " guessed a consonant.");

  }

}
 

Комментарии:

1. prompt() вызывает checkGuessType() , а затем player1() вызывает его снова. Но второй вызов не передает необходимый аргумент, поэтому при попытке его использования вы должны получить сообщение об ошибке playerGuess.length .

2. Вы не показали checkGuess() , но поскольку вы не передаете ему аргумент, как он должен знать, что такое предположение?

3. Спасибо за ответ! Предполагается, что код получает предположение из переменной, значение которой задается из приглашения, но это приглашение никогда не возникает — только заполнение консоли операторами «Prompting». Кроме того, я не настроил функцию checkGuess(), я сделаю это после того, как смогу разобраться с этой ошибкой.

Ответ №1:

Причина, по которой «Запрос» появляется снова и снова, заключается в том, что вы указываете playerGuess в качестве аргумента для checkGuessType in prompt , но playerGuess это просто еще один вызов prompt , поэтому он начинает повторяться. Однако prompt never возвращает какое-либо значение ни при каких условиях, поэтому рекурсия никогда не преобразуется в значение, вызывающее сворачивание стека вызовов функций и выполнение вызова to checkGuessType , поэтому вы никогда не увидите повторения console.log in checkGuessType .

Редактировать

После вашего редактирования я просто хотел указать на то, в чем, по моему мнению, проблема напрямую:

 function prompt() {

    // console.log("Prompting");
    
    playerGuess = prompt("What letter would you like to guess?");

}
 

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

Комментарии:

1. Спасибо за ответ! Я попытался изменить часть кода (переключив тип переменной), но возникает та же ошибка. Я отредактировал исходное сообщение с новой информацией, не могли бы вы это проверить?

2. Использование переменной не вызывает функцию повторно.

3. @Barmar он не использовал переменную, которая, как я говорил, вызывала бы ее снова, но переменная была просто еще одним вызовом функции для prompt самой себя, которая снова вызывала prompt бы саму себя, и так далее, и тому подобное.

4. О, я вижу путаницу — он назвал свою функцию prompt() , которая совпадает со встроенной функцией, запрашивающей ввод.

5. @Bubbly Я добавил больше информации, имеет ли это смысл / кажется, проблема?