Ошибка синтаксического анализа: ключевое слово «класс» зарезервировано

У меня есть объект класса, который, как я думал, работал прошлой ночью. Но теперь я пытаюсь проверить свой метод set Hash, поэтому я делаю: blah = new HashTable; и он говорит, что HashTable не определен.

У меня есть другой файл, который здесь не связан, и все его переменные также отображаются как неопределенные (в консоли). Клянусь, у меня это сработало прошлой ночью, так что я рассержен.

Я получаю сообщение об ошибке, которое, возможно, я не замечал раньше, но оно говорит

ОШИБКА: ошибка синтаксического анализа: ключевое слово "класс" зарезервировано class HashTable

JSLint(2) Ожидал идентификатор и вместо этого видел "класс". Остановка. (4% просмотрено).

Что я делаю не так? Кто-нибудь, пожалуйста, помогите.

Мое желание - просто проверить мой код javascript в консоли, чтобы убедиться, что все работает. Я попробовал фрагмент Google Chrome, и в нем есть ошибки. Я попробовал codepen, и это песочница, поэтому он не работает должным образом в консоли, теперь я пробую скобки, и он также не позволяет мне тестировать в консоли. Становится так расстроен.

class HashTable {
    constructor(size){
        this.keyMap = new Array(size);
    }

function _hash(key) {
    let total = 0;
    let prime = 31
    for (let i = 0; i < Math.min(key.length, 100); i++) {
        let char = key[i];
        let value = char.charCodeAt(0) - 96;
        total  = (total * prime + value) % this.keyMap;
    }
    return total;
   }

    function set(key){
        hashNumber = this._hash(key);
        return hashNumber;
    }

}

-

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src = "app.js"></script>
    <script src = "hash.js"></script>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Please work</h1>

</body>
</html>

person Mugs    schedule 22.09.2019    source источник
comment
Какой бы инструмент ни выдавал вам ошибку class, он устарел. Начиная с ES2015, class не просто зарезервировано, оно используется — для того, для чего вы пытаетесь его использовать. Похоже, вам нужно обновить свои инструменты, я уверен, что текущая версия JSLint (например) понимает синтаксис class.   -  person T.J. Crowder    schedule 22.09.2019


Ответы (2)


Я не знаю, относится ли это конкретно к ошибкам, которые вы вызвали, или нет, но в вашем классе HashTable есть синтаксические ошибки. Вы не используете function для определения методов класса в конструкции class. Так:

class HashTable {
    constructor(size){
        this.keyMap = new Array(size);
    }

    _hash(key) {
//  ^--------------------------------------- no `function` here
        let total = 0;
        let prime = 31
        for (let i = 0; i < Math.min(key.length, 100); i++) {
            let char = key[i];
            let value = char.charCodeAt(0) - 96;
            total  = (total * prime + value) % this.keyMap;
        }
        return total;
    }

    set(key) {
//  ^--------------------------------------- nor here
        hashNumber = this._hash(key);
        return hashNumber;
    }
}

Другие примечания:

  • Практически никогда нет причин использовать new Array.

  • Вы используете массив, который вы присвоили this.keyMap, в качестве числа в выражении total = (total * prime + value) % this.keyMap;, что не имеет никакого смысла.

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

person T.J. Crowder    schedule 22.09.2019
comment
Да, это полностью исправлено. Благодарю вас! Я умирал. Я все еще получаю сообщение об ошибке, но, по крайней мере, сейчас оно работает, и это все, что меня волнует. У меня также были переменные, объявленные в моем другом файле js, и я удалил объявление var, и они тоже начали работать. Ты лучший! - person Mugs; 23.09.2019
comment
о, я использовал простые числа, потому что я слышал их математику, которая заставляет хэш-функцию давать числа более разбросанными, а также ускоряет вычисления. - person Mugs; 23.09.2019

Не совсем правда @T.J. Crowder: ESLint 7.11.0 с node 14.14 (в настоящее время последние версии) выдает эту ошибку.

Несмотря на то, что ESLint предпочтительнее JSLint (как упоминалось здесь), кажется babel-eslint предпочтительнее (как указано в здесь), и это решит эту проблему. проблема.

person DZet    schedule 16.10.2020