Почему моя функция проверки ответа получает сообщение об ошибке и не может получить доступ к массиву переменных из другой функции? - PullRequest
0 голосов
/ 27 октября 2019
var quiz = [
  ["What is Superman's real name?", "Clarke Kent"],
  ["What is Wonderwoman's real name?", "Dianna Prince"],
  ["What is Batman's real name?", "Bruce Wayne"]
];

var score = 0 // initialize score
play(quiz);

function play(quiz) {
  for (var i = 0, question, answer, max = quiz.length; i < max; i++) {
    question = quiz[i][0];
    answer = ask(question);
    check(answer);
  } // end of main game loop  gameOver();
}
}

function ask(question) {
  return prompt(question);
}

Здесь я получаю сообщение об ошибке из журнала консоли

Uncaught ReferenceError: i is not defined
      at check (VM13 novice.js:26)
      at play (VM13 novice.js:16)
      at VM13 novice.js:5 
function check(answer) {
  if (answer === quiz[i][1]) {
    alert("Correct!");
    score++;
  } else {
    alert("Wrong!");
  }
}

1 Ответ

0 голосов
/ 27 октября 2019

Проблема в том, что в области действия вашей функции check нет переменной i. Если вы хотите сравнить ответ, вы должны знать правильную позицию в массиве.

Один из вариантов - передать i в check, что решит вашу непосредственную проблему. Однако было бы даже лучше, если бы вы вместо этого ответили ожидаемым ответом - тогда check не нужно знать, где хранятся вопросы и ответы. Таким образом, в будущем вы можете представлять данные по-другому с меньшим количеством необходимых изменений:

var quiz = [
  ["What is Superman's real name?", "Clarke Kent"],
  ["What is Wonderwoman's real name?", "Dianna Prince"],
  ["What is Batman's real name?", "Bruce Wayne"]
];

var score = 0 // initialize score
play(quiz);

function play(quiz) {
  for (var i = 0, question, answer, max = quiz.length; i < max; i++) {
    question = quiz[i][0];
    //also extract the answer to the question
    expectedAnswer = quiz[i][1];
    userAnswer = ask(question);
    check(userAnswer, expectedAnswer);
  } // end of main game loop  gameOver();
}


function ask(question) {
  return prompt(question);
}

//the function now takes both the user and the expected answers to check them
function check(userAnswer, expectedAnswer) {
  if (userAnswer === expectedAnswer) {
    alert("Correct!");
    score++;
  } else {
    alert("Wrong!");
  }
}
...