Uncaught ReferenceError: результаты не определены, но массив определен

Я новичок в JavaScript.

Когда я запускаю этот код, я получаю эту ошибку в Chrome's console: Uncaught ReferenceError: aresults is not defined

aresults представляет собой array. Я думал, что инициализировал его до того, как запустится For loop, который создает целые числа, которые array будет хранить. Но Chrome вроде говорит, что array нет.

Готовый код предназначен для создания определенного пользователем количества целых чисел от 1 до 10 и сохранения их в массиве, а затем подсчета количества целых чисел в массиве, которые находятся между заданным пользователем целевым значением и 10.

Что я здесь сделал не так? И как я могу это исправить?

Спасибо.

<!DOCTYPE html>
<head>
</head>

<body>

    <h2>Storyteller dice roller</h2>

    <!--User selects number of 10-sided dice to be rolled, and target number -->
    Number of dice: <input type = "number" value = "5" id = "dice"><br>
    Difficulty: <input type = "number" value = "6" id = "diff"><br>

    <!--Button executes the "roll" JavaScript function-->
    <button onclick = "roll()">Roll</button>

    <script>

        function roll() {

            // initialize array to store results of "dice rolls"
            var aresults = [];

            // store user input of "Number of dice" as vdice variable
            var vdice = document.getElementById("dice").value;

            // store user input of "Difficulty" as vdiff variable
            var vdiff = document.getElementById("diff").value;

            // simulates rolling a number of 10-sided dice

            // for loop:
            // set vrolled to 0;
            // run loop if vrolled is less than dice;
            // increase vrolled by 1 each time loop is run
            // continue for as many times as there are "dice"
            for (vrolled = 0; vrolled <= vdice; vrolled++) {

                // Create a random number between 1 and 10
                var vresult=Math.floor(Math.random() * 10) + 1;

                // append the new dice roll result to the array
                aresults.push(vresult);

            }
        }

        // Display variable results in console
        console.info("Results array");
        console.info(aresults);
        console.info("Dice to be rolled");
        console.info(vdice);
        console.info("Roll result");
        console.info(vresult);
        console.info("Difficulty");
        console.info(vdiff);
        console.info("Dice rolled");
        console.info(vrolled);
    </script>
</body>

Вы можете подумать об использовании согласованных отступов при написании кода — это значительно упростит чтение и отладку не только для потенциальных ответчиков, но и для вас, когда мы все сможем сразу увидеть блоки {} и их уровень вложенности, вместо того, чтобы тщательно выбирать каждую строку, чтобы выбрать логические пути. (При правильном отступе вы увидите, что aresults не входит в область действия на верхнем уровне, где вы пытаетесь его зарегистрировать)

CertainPerformance 26.01.2019 23:55
aresults объявлен внутри функции roll, он не определен в глобальной области видимости.
Bergi 26.01.2019 23:58

@CertainPerformance Спасибо за совет. И извините, что усложняю задачу. Я пишу код в Sublime Text 3. Я вырезал и вставлял между разными версиями кода, которые скремблировали отступы. И автоматическое исправление ST не помогло.

Richard Cosgrove 27.01.2019 01:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

<!DOCTYPE html>
<head>
</head>

<body>

    <h2>Storyteller dice roller</h2>

    <!--User selects number of 10-sided dice to be rolled, and target number -->
    Number of dice: <input type = "number" value = "5" id = "dice"><br>
    Difficulty: <input type = "number" value = "6" id = "diff"><br>

    <!--Button executes the "roll" JavaScript function-->
    <button onclick = "roll()">Roll</button>

    <script>
var aresults = [];
var vdice = document.getElementById("dice").value;
var vresult;
// store user input of "Difficulty" as vdiff variable
var vdiff = document.getElementById("diff").value;
        function roll() {

// initialize array to store results of "dice rolls"


// store user input of "Number of dice" as vdice variable


// simulates rolling a number of 10-sided dice

// for loop:
// set vrolled to 0;
// run loop if vrolled is less than dice;
// increase vrolled by 1 each time loop is run
// continue for as many times as there are "dice"
for (vrolled = 0; vrolled <= vdice; vrolled++) {

// Create a random number between 1 and 10
vresult=Math.floor(Math.random() * 10) + 1;

// append the new dice roll result to the array
aresults.push(vresult);

}
}

// Display variable results in console
console.info("Results array");
console.info(aresults);
console.info("Dice to be rolled");
console.info(vdice);
console.info("Roll result");
console.info(vresult);
console.info("Difficulty");
console.info(vdiff);
console.info("Dice rolled");
console.info(vrolled);
</script>
</body>

Спасибо. Я пытался разместить "varresults = [];" вне функции, но это все равно не сработало. Переместил его в головной раздел, и теперь он распознается.

Richard Cosgrove 27.01.2019 00:59

Другие вопросы по теме