Как устранить ошибки «ReferenceError», «SyntaxError» и «TypeError» в JavaScript
Введение
JavaScript — это язык программирования, используемый во фронтенд- и бэкенд-разработке. При работе с JavaScript расшифровка сообщений об ошибках может показаться немного сложной. Понимание того, на что ссылается сообщение об ошибке, важно при устранении неполадок в приложении. К счастью, современные браузеры поставляются со встроенными инструментами отладки, которые помогают в этом. Каждый браузер обрабатывает сообщения об ошибках по-разному, когда дело доходит до визуального представления. Тем не менее, сообщения об ошибках подскажут вам, что происходит с вашим кодом JavaScript.
В этом руководстве вы узнаете о трех распространенных типах ошибок JavaScript, которые появляются в среде браузера: ReferenceError
, SyntaxError
и TypeError
. Чтобы продолжить, вы должны иметь представление о JavaScript и консоли разработчика.
Вы можете узнать больше о JavaScript из нашего учебника «Как использовать консоль разработчика JavaScript».
Следующие примеры не являются исчерпывающими и служат в качестве основы для распространенных сообщений об ошибках, с которыми вы можете столкнуться. Кроме того, сообщения об ошибках в примерах исходят от веб-браузера Chrome. Сообщения об ошибках, которые вы получаете от Firefox или Edge, могут содержать немного разные сообщения, но типы ошибок одинаковы.
Понимание типов ошибок JavaScript
Ошибки в JavaScript основаны на объекте Error
. Это встроенный объект, заполненный информацией о типе возникшей ошибки, за которым следует сообщение с подробным описанием возможной причины. Например, вы можете столкнуться с ошибкой следующего содержания:
VM170:1 Uncaught ReferenceError: shark is not defined
at <anonymous>:1:1
Если вы разберете это сообщение об ошибке, вы узнаете, что ReferenceError
— это обнаруженный тип ошибки. После точки с запятой следует сообщение об ошибке, описывающее ошибку: акула не определена
. В последней строке этого сообщения указано, где возникает ошибка в вашем коде 1:1
.
Каждый раз, когда в браузере обнаруживается ошибка, тип ошибки и сообщение указывают на проблему. С помощью этой информации вы можете определить, как отлаживать свой код на основе типа ошибки и сообщения, которое вы получаете.
Понимание ReferenceError
ReferenceError
возникает, когда вы пытаетесь получить доступ к переменной, которую вы еще не создали. Это также происходит, когда вы вызываете переменную перед ее инициализацией.
Встреча с неопределенными переменными
Например, если вы неправильно написали имя переменной при выполнении console.log()
, вы получите ReferenceError
:
let sammy = 'A Shark dreaming of the cloud.';
console.log(sammmy);
OutputUncaught ReferenceError: sammmy is not defined
at <anonymous>:1:13
Переменная sammmy
с тремя ms
не существует и не определена. Чтобы исправить эту ошибку, вы можете обновить переменную до правильного написания и снова запустить команду. В случае успеха вы не получите сообщение об ошибке. В целом, проверка вашего кода на наличие орфографических ошибок может помочь предотвратить ошибки с неопределенными переменными.
Доступ к переменной до ее объявления
Точно так же вы можете столкнуться со следующей ошибкой, когда пытаетесь получить доступ к переменной до того, как она объявлена в вашем коде:
function sharkName() {
console.log(shark);
let shark = 'sammy';
}
OutputVM223:2 Uncaught ReferenceError: Cannot access 'shark' before initialization
at sharkName (<anonymous>:2:17)
at <anonymous>:1:1
В этом примере console.log(shark)
выполняется до объявления переменной shark
, что приводит к ошибке. В общем, рекомендуется сначала объявить свои переменные, прежде чем пытаться получить к ним доступ.
Примечание. Из-за того, как работают объявления let
и const
, они поднимаются, но недоступны в предыдущем примере. В подобных случаях переменные let
и const
входят в так называемую «временную мертвую зону». Чтобы избежать этого, объявите переменные let
и const
в начале области видимости.
Чтобы исправить пример кода, объявите переменную shark
перед выполнением команды console.log()
:
function sharkName() {
let shark = 'sammy';
console.log(shark);
}
Ошибка ReferenceError
часто связана с вашими переменными и областью видимости. Хотя это выходит за рамки данного руководства, вы можете узнать больше об области действия, различных типах переменных и подъеме в нашем руководстве «Понимание переменных, области действия и подъема в JavaScript».
Понимание синтаксической ошибки
Когда интерпретатор JavaScript просматривает ваш код, он может выдать SyntaxError
, если наткнется на код, который не соответствует спецификациям языка. Если это произойдет, ваш код прекратит выполнение, и вы получите сообщение о вашем синтаксисе.
Отсутствует корпус кода
Например, когда вы пишете функцию и забыли круглую скобку )
, чтобы заключить свой код, вы получите SyntaxError
с очень конкретным сообщением о том, что вы отсутствуют:
function sammy(animal) {
if(animal == 'shark'){
return `I'm cool`;
} else {
return `You're cool`;
}
}
sammy('shark';
OutputUncaught SyntaxError: missing ) after argument list
К счастью, в сообщении об ошибке указывается недостающий элемент в коде. В этом примере в вызове функции sammy
отсутствует закрывающая скобка )
:
. . .
sammy('shark');
Эта ошибка также возникает при пропуске закрывающей фигурной скобки }
в конце функции или скобки ]
в массиве. Убедитесь, что вы правильно закрываете свои функции, массивы и объекты.
Объявление одинаковых имен переменных
Вы также можете столкнуться с этой ошибкой при использовании того же имени переменной, что и параметр функции, и внутри тела функции. Возьмем следующий пример:
function sammy(animal) {
let animal = 'shark';
}
OutputVM132:2 Uncaught SyntaxError: Identifier 'animal' has already been declared
Чтобы исправить ошибку, обязательно создайте уникальные и специфические имена переменных в теле функции. Объявляя новое имя переменной, например, animalType
, вы устраняете конфликт между параметром функции и переменной let
внутри тела:
function sammy(animal) {
let animalType = 'shark';
}
Если вы собираетесь изменить или использовать параметр в теле функции, не используйте объявление переменной с тем же именем переменной. Например, вы можете удалить объявление let
в теле:
function sammy(animal) {
animal = 'shark';
}
При работе с переменными внутри и снаружи тела функции убедитесь, что вы называете ее уникальным образом. При доступе к параметрам функции вы можете использовать их в теле функции без объявления переменной, например let
.
Выявление неожиданных токенов
Подобно отсутствию скобки ]
или фигурной скобки }
, иногда вам может понадобиться небольшое, но важное дополнение к вашему коду. Например:
let sharkCount = 0;
function sammy() {
sharkCount+;
console.log(sharkCount);
}
OutputUncaught SyntaxError: Unexpected token ';'
Дополнительным элементом в этом примере является знак плюса +
после sharkCount
внутри тела функции:
. . .
function sammy() {
sharkCount++;
console.log(sharkCount);
}
Если вы столкнулись с ошибкой SyntaxError: Unexpected token
, дважды проверьте свой код на наличие отсутствующих или дополнительных операторов, таких как знак плюс (+
).
Понимание ошибки типа
TypeError
возникает, когда значение функции или переменной имеет непредвиденный тип. Вы можете узнать больше о различных типах данных JavaScript, ознакомившись с нашим учебником «Понимание типов данных в JavaScript».
Использование методов массива для объектов
Распространенной ошибкой является использование метода массива для перебора объекта. Например, вы не можете перебрать объект с помощью метода .map()
, потому что это метод, специфичный для массива:
const sharks = {
shark1: 'sammy',
shark2: 'shelly',
shark3: 'sheldon'
}
sharks.map((shark) => `Hello there ${shark}!`);
OutputUncaught TypeError: sharks.map is not a function
at <anonymous>:1:8
Одним из вариантов исправления предыдущего примера является использование цикла for...in
, который работает для типа данных объекта, в объекте sharks
для извлечения значений:
const sharks = {
shark1: 'sammy',
shark2: 'shelly',
shark3: 'sheldon'
}
for (let key in sharks) {
console.log(`Hello there ${sharks[key]}!`);
}
Кроме того, вы можете превратить объект sharks
в массив, чтобы использовать метод .map()
:
const sharks = ['sammy', 'shelly', 'sheldon'];
sharks.map((shark) => `Hello there ${shark}!`);
Когда вы работаете с разными массивами и объектами, легко перепутать разные методы. Дважды проверьте, подходит ли ваш метод для типа данных, с которыми вы работаете.
Использование правильных методов деструктуризации
Аналогично, попытка перебора объекта с деструктурированием массива вызовет TypeError
:
const shark = {
name: 'sammy',
age: 12,
cloudPlatform: 'DigitalOcean'
}
const [name, age, cloudPlatform] = sharks;
OutputVM23:7 Uncaught TypeError: sharks is not iterable
at <anonymous>:7:26
Один из способов решить эту проблему — использовать деструктурирование объекта для создания новых переменных на основе ключей объекта:
const shark = {
name: 'sammy',
age: 12,
cloudPlatform: 'DigitalOcean'
}
const {name, age, cloudPlatform} = shark;
console.log(name);
Outputsammy
В зависимости от того, как вы структурируете свои данные, будь то массивы или объекты, обязательно используйте соответствующие методы для извлечения значений.
Заключение
В этом руководстве вы узнали о трех распространенных типах ошибок JavaScript, некоторых связанных с ними сообщениях и о том, как отлаживать распространенные проблемы, когда вы с ними сталкиваетесь. Хотя это и не исчерпывающе, вы получили представление о том, как JavaScript и браузер работают вместе, чтобы указать на проблемы в вашем коде.
Вы можете узнать больше о том, как использовать методы массива JavaScript, чтобы лучше понять, как применять эти методы.
Вы также можете узнать больше об отладке с помощью инструментов Chrome Dev в нашем руководстве по отладке JavaScript с помощью Google Chrome DevTools и Visual Studio Code.