Как заменить ключевые слова «var» в этом коде на «let» и «const»?

Если я заменю ключевые слова «var» на «let» или «const», я получу ошибку userChoice is notdefined.

Я уже пробовал заменить все на «let» или «const». Я также поместил userChoice в функцию и вызывал ее всякий раз, когда мне это было нужно. Я также попытался поместить весь цикл while в функцию. Программа отлично работает с "var".

Самое далекое, что я получил с помощью «let» и «const», это / Как только я попытался поместить его в цикл while, он перестал работать:

const arrayList = [];
let userChoice = prompt('What would you like to do?');
// Array list is empty array
if (userChoice === "new") {
    let newTodo = prompt('Enter a new todo');
    arrayList.push(newTodo);
} else if (userChoice === "list") {
    console.info(arrayList);
}

Рабочий код:

var arrayList = [];
var userChoice = prompt('What would you like to do?');
// Array list is empty array
while (userChoice !== "quit") {
    if (userChoice === "new") {
        var newTodo = prompt('Enter a new todo');
        arrayList.push(newTodo);
    } else if (userChoice === "list") {
        console.info(arrayList);
    }
    var userChoice = prompt('What would you like to do?');
}

Я ожидаю, что эта программа будет постоянно подсказывать, пока вы не скажете «выход». Вы вводите «новый», чтобы добавить новую задачу, и «список», чтобы перечислить все задачи.

Пожалуйста, покажите нам замены, которые вы пробовали.

user47589 09.04.2019 18:43

Во предпоследней строке вы повторно объявляете userChoice. Это опечатка?

natsuozawa 09.04.2019 18:44
Поведение ключевого слова "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
2
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема в том, что этот код дважды объявляет userChoice, второй var на нем не нужен:

var arrayList = [];
var userChoice = prompt('What would you like to do?');
// Array list is empty array
while (userChoice !== "quit") {
    if (userChoice === "new") {
        var newTodo = prompt('Enter a new todo');
        arrayList.push(newTodo);
    } else if (userChoice === "list") {
        console.info(arrayList);
    }
    var userChoice = prompt('What would you like to do?');
//  ^^^---------------------------------------------------- here
}

С var это не имеет значения, потому что var имеет область действия функции (или глобальную область, если используется вне функции), а множественные объявления игнорируются, но это имеет значение с let, потому что let является блочный, поэтому объявление нового userChoice внутри блока затеняет внешний один. (Несколько объявлений с let являются ошибкой в ​​​​одной и той же области видимости, так как это не имеет смысла, и если это будет разрешено, это усложнит ситуацию.)

Просто удалите этот второй var и замените другие var на let (или вы можете использовать const для arrayList и newTodo, если только код, который не показан, не присваивает новый массив arrayList позже):

const arrayList = []; // Or let
let userChoice = prompt('What would you like to do?');
// Array list is empty array
while (userChoice !== "quit") {
    if (userChoice === "new") {
        const newTodo = prompt('Enter a new todo'); // Or let if you prefer
        arrayList.push(newTodo);
    } else if (userChoice === "list") {
        console.info(arrayList);
    }
    userChoice = prompt('What would you like to do?');
}

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