Объект ReferenceError представляет ошибку, возникающую при обращении к несуществующей переменной.
Синтаксис
new ReferenceError([message[, fileName[, lineNumber]]])
Параметры
message-
Необязательный параметр. Человеко-читаемое описание ошибки
fileName
Non-standard
-
Необязательный параметр. Имя файла, содержащего код, вызвавший исключение
lineNumber
Non-standard
-
Необязательный параметр. Номер строки кода, вызвавшей исключение
Описание
Исключение ReferenceError выбрасывается при попытке обратиться к переменной, которая не была объявлена.
Свойства
ReferenceError.prototype(en-US)-
Позволяет добавлять свойства в объект
ReferenceError.
Методы
Глобальный объект ReferenceError не содержит собственных методов, однако, он наследует некоторые методы из цепочки прототипов.
Свойства
{{page(‘/ru/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype’, ‘Properties’)}}
Методы
{{page(‘/ru/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError/prototype’, ‘Methods’)}}
Примеры
Перехват ReferenceError
try {
var a = undefinedVariable;
} catch (e) {
console.log(e instanceof ReferenceError); // true
console.log(e.message); // "undefinedVariable is not defined"
console.log(e.name); // "ReferenceError"
console.log(e.fileName); // "Scratchpad/1"
console.log(e.lineNumber); // 2
console.log(e.columnNumber); // 6
console.log(e.stack); // "@Scratchpad/2:2:7n"
}
Выбрасывание ReferenceError
try {
throw new ReferenceError('Привет', 'someFile.js', 10);
} catch (e) {
console.log(e instanceof ReferenceError); // true
console.log(e.message); // "Привет"
console.log(e.name); // "ReferenceError"
console.log(e.fileName); // "someFile.js"
console.log(e.lineNumber); // 10
console.log(e.columnNumber); // 0
console.log(e.stack); // "@Scratchpad/2:2:9n"
}
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-native-error-types-used-in-this-standard-referenceerror |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Типы ошибок
Последнее обновление: 30.08.2021
В блоке catch мы можем получить информацию об ошибке, которая представляет объект. Все ошибки, которые генерируются интерретатором JavaScript,
предоставляют объект типа Error, который имеет ряд свойств:
-
message: сообщение об ошибке
-
name: тип ошибки
Стоит отметить, что отдельные браузеры поддерживают еще ряд свойств, но их поведение в зависимости от браузера может отличаться:
-
fileName: название файла с кодом JavaScript, где произошла ошибка
-
lineNumber: строка в файле, где произошла ошибка
-
columnNumber: столбец в строке, где произошла ошибка
-
stack: стек ошибки
Получим данные ошибки, например, при вызове несуществующей функции:
try{
callSomeFunc();
}
catch(error){
console.log("Тип ошибки:", error.name);
console.log("Ошибка:", error.message);
}
Консольный вывод:
Тип ошибки: ReferenceError Ошибка: callSomeFunc is not defined
Типы ошибок
Выше мы рассмотрели, что генерируемая интерпретатором ошибка представляет тип Error, однако при вызове несуществующей функции
генерируется ошибка типа ReferenceError. Дело в том, что тип Error представляет общий тип ошибок. В то же время есть конкретные типы ошибок для определенных ситуаций:
-
EvalError: представляет ошибку, которая генерируется при выполнении глобальной функции
eval() -
RangeError: ошибка генерируется, если параметр или переменная, представляют число, которое находится вне некотоого допустимого диапазона
-
ReferenceError: ошибка генерируется при обращении к несуществующей ссылке
-
SyntaxError: представляет ошибку синтаксиса
-
TypeError: ошибка генерируется, если значение переменной или параметра представляют некорректный тип или пр попытке изменить значение, которое нельзя изменять
-
URIError: ошибка генерируется при передаче функциям
encodeURI()иdecodeURI()некорректных значений -
AggregateError: предоставляет ошибку, которая объединяет несколько возникших ошибок
Например, при попытке присвоить константе второй раз значение, генерируется ошибка TypeError:
try{
const num = 9;
num = 7;
}
catch(error){
console.log(error.name); // TypeError
console.log(error.message); // Assignment to constant variable.
}
Применение типов ошибок
При генерации ошибок мы можем использовать встроенные типы ошибок. Например:
class Person{
constructor(name, age){
if(age < 0) throw new Error("Возраст должен быть положительным");
this.name = name;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
try{
const tom = new Person("Tom", -45);
tom.print();
}
catch(error){
console.log(error.message); // Возраст должен быть положительным
}
Здесь конструктор класса Person принимает значения для имени и возаста человека. Если передан отрицательный возраст, то генерируем ошибку в виде объекта Error. В качестве параметра в
конструктор Error передается сообщение об ошибке:
if(age < 0) throw new Error("Возраст должен быть положительным");
В итоге при обработке исключения в блоке catch мы сможем получить переданное сообщение об ошибке.
Все остальные типы ошибок в качестве первого параметра в конструкторе также принимают сообщение об ошибке. Так, сгенерируем несколько типов ошибок:
class Person{
constructor(pName, pAge){
const age = parseInt(pAge);
if(isNaN(age)) throw new TypeError("Возраст должен представлять число");
if(age < 0 || age > 120) throw new RangeError("Возраст должен быть больше 0 и меньше 120");
this.name = pName;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
Поскольку для возраста можно ередатьне только число, но и вообще какое угодно значение, то вначале мы пытаемся преобразовать это значение в число с помощью
функции parseInt():
const age = parseInt(pAge);
if(isNaN(age)) throw new TypeError("Возраст должен представлять число");
Далее с помощью функции isNaN(age) проверяем, является полученное число числом. Если age — НЕ число, то данная функция возвращает true. Поэтому
генерируется ошибка типа TypeError.
Затем проверяем, что полученное число входит в допустимый диапазон. Если же не входит, генерируем ошибку типа RangeError:
if(age < 0 || age > 120) throw new RangeError("Возраст должен быть больше 0 и меньше 120");
Проверим генерацию исключений:
try{
const tom = new Person("Tom", -45);
}
catch(error){
console.log(error.message); // Возраст должен быть больше 0 и меньше 120
}
try{
const bob = new Person("Bob", "bla bla");
}
catch(error){
console.log(error.message); // Возраст должен представлять число
}
try{
const sam = new Person("Sam", 23);
sam.print(); // Name: Sam Age: 23
}
catch(error){
console.log(error.message);
}
Консольный вывод:
Возраст должен быть больше 0 и меньше 120 Возраст должен представлять число Name: Sam Age: 23
Обработка нескольких типов ошибок
При выполнении одного и то же кода могут генерироваться ошибки разных типов. И иногда бывает необходимо разграничить обработку разных типов.
В этом случае мы можем проверять тип возникшей ошибки. Например, пример выше с классом Person:
class Person{
constructor(pName, pAge){
const age = parseInt(pAge);
if(isNaN(age)) throw new TypeError("Возраст должен представлять число");
if(age < 0 || age > 120) throw new RangeError("Возраст должен быть больше 0 и меньше 120");
this.name = pName;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
try{
const tom = new Person("Tom", -45);
const bob = new Person("Bob", "bla bla");
}
catch(error){
if (error instanceof TypeError) {
console.log("Некорректный тип данных.");
} else if (error instanceof RangeError) {
console.log("Недопустимое значение");
}
console.log(error.message);
}
Создание своих типов ошибок
Мы не ограничены встроенными только встроенными типами ошибок и при необходимости можем создавать свои типы ошибок, предназначеные для каких-то конкретных ситуаций.
Например:
class PersonError extends Error {
constructor(value, ...params) {
// остальные параметры передаем в конструктор базового класса
super(...params)
this.name = "PersonError"
this.argument = value;
}
}
class Person{
constructor(pName, pAge){
const age = parseInt(pAge);
if(isNaN(age)) throw new PersonError(pAge, "Возраст должен представлять число");
if(age < 0 || age > 120) throw new PersonError(pAge, "Возраст должен быть больше 0 и меньше 120");
this.name = pName;
this.age = age;
}
print(){ console.log(`Name: ${this.name} Age: ${this.age}`);}
}
try{
//const tom = new Person("Tom", -45);
const bob = new Person("Bob", "bla bla");
}
catch(error){
if (error instanceof PersonError) {
console.log("Ошибка типа Person. Некорректное значение:", error.argument);
}
console.log(error.message);
}
Консольный вывод
Ошибка типа Person. Некорректное значение: bla bla Возраст должен представлять число
Для представления ошибки класса Person здесь определен тип PersonError, который наследуется от класса Error:
class PersonError extends Error {
constructor(value, ...params) {
// остальные параметры передаем в конструктор базового класса
super(...params)
this.name = "PersonError"
this.argument = value;
}
}
В конструкторе мы определяем дополнительное свойство — argument. Оно будет хранить значение, которое вызвало ошибку. С помощью параметра value конструктора
получаем это значение. Кроме того, переопреляем имя типа с помощью свойства this.name.
В классе Person используем этот тип, передавая в конструктор PersonError соответствующие значения:
if(isNaN(age)) throw new PersonError(pAge, "Возраст должен представлять число"); if(age < 0 || age > 120) throw new PersonError(pAge, "Возраст должен быть больше 0 и меньше 120");
Затем при обработки исключения мы можем проверить тип, и если он представляет класс PersonError, то обратиться к его свойству argument:
catch(error){
if (error instanceof PersonError) {
console.log("Ошибка типа Person. Некорректное значение:", error.argument);
}
console.log(error.message);
}
Я работаю над некоторыми учебниками по веб-аудио в этой книге O’Reilly: http://chimera.labs.oreilly.com/books/1234000001552/ch02.html#s02_2
Следующий код предназначен для создания системы для приостановки аудиофайла и возобновления воспроизведения.
// Assume context is a web audio context, buffer is a pre-loaded audio buffer.
var startOffset = 0;
var startTime = 0;
function pause() {
source.stop();
// Measure how much time passed since the last pause.
startOffset += context.currentTime - startTime;
}
function play() {
startTime = context.currentTime;
var source = context.createBufferSource();
// Connect graph
source.buffer = this.buffer;
source.loop = true;
source.connect(context.destination);
// Start playback, but make sure we stay in bound of the buffer.
source.start(0, startOffset % buffer.duration);
}
Однако запуск pause() функция приводит к следующей ошибке:
Uncaught ReferenceError: source is not defined
Теперь, с моей точки зрения, это вызвано тем, что source был определен с var ключевое слово, делающее его ограниченным play() функции и поэтому недоступны для pause(). Удаление var ключевое слово действительно решает проблему. Может ли кто-нибудь просто заверить меня, что мои рассуждения верны? Это просто опечатка или есть какой-то принцип, который я не понимаю? (Я проверил опечатки для книги, и там нет упоминания об этом.)
Lisa Kapral
Здравствуйте, объясните, пожалуйста, что я делаю не так с type
https://ru.hexlet.io/code_reviews/278187
9
1
Вадим С.
Lisa Kapral, у вас вместо Type Error получается Reference Error. Вы присваиваете константе вызов функции, в которую передаете неопределенную переменную. Попробуйте изменить условие, чтобы была именно ошибка типизации, примерно как в теории:
вы создали и числовую константу и функцию, а потом пытаетесь вызвать число
0
Lisa Kapral
Хахахах, да, вы полностью правы, я не до конца понимаю, как работает typeerror. Я сразу же сделала reference, но вот с type я сижу вторые сутки, и задание выполняется только на половину
0
Lisa Kapral
Также я копировала ошибку из теории, но итог оказывался плачевным для меня
0
Lisa Kapral
● Test suite failed to run
TypeError: type is not a function
1 | const type = 20
> 2 | const right = type(10);
0
Вадим С.
Lisa Kapral, вот именно так, как написано в задании:
Сделайте так, чтобы код внутри функции type порождал ошибку типа TypeError.
А потом, если не будет работать, выложите ревью сюда, посмотрим
0
Lisa Kapral
еще раз здравствуйте!
const type = (a) => 5 * 2; {
const right = type(30);
};
0
Вадим С.
Lisa Kapral, смотрите как:
const type = () => {
какой-то код, порождающий ошибку typeError. Любой.
}
1
Lisa Kapral
Вадим С., Ура,спасибо!!! я сделала, правда еще остался вопрос, почему было достаточно ничего не прописывать в константе?
0
Вадим С.
Lisa Kapral, в скобках — аргумент, который вы передаете в функцию. В данном случае, вам необязательно что-то в функцию передавать, чтобы выполнить задание. Но, конечно, можете и передать, ничего не изменится)
0
У вас вечеринка, а закуска кончилась, вы просите подругу что-нибудь купить.
— Эй, можешь сходить в магазин и купить какой-нибудь еды?
Она отвечает:
— Что именно?
Вы говорите:
— Ну, типа чипсы или что-нибудь такое. У нас всё закончилось.
Она отвечает:
— Сколько упаковок чипсов взять?
И у вас уже начинает немного вскипать мозг:
— Да, я не знаю, штук 5.
— А какие чипсы?
И вы так глазами делаете и отвечаете «ааа… забудь», или решаете идти до конца и объясняете подробно задачу: «Возьми 5 средних пакетов картофельных чипсов со вкусом бекона».
Десять минут спустя она возвращается с пустыми руками и говорит «у них не было таких чипсов в пакетах среднего размера».
О «программистах» есть определённые стереотипы и то, что они могут быть слишком конкретными и чересчур дотошными — один из них. Многие думают, что такие люди хорошо разбираются в математике или что-то подобное.
В реальности всё намного сложнее. Не существует всего двух типов людей, спектр типов личности буквально бесконечен. И для некоторых людей программирование немного более органично, потому что компьютеры абсолютно конкретные и абсурдно однозначные. Это совершенно не значит, что если вы считаете, что у вас «нематематический склад ума», вы не сможете стать хорошим разработчиком. Это значит только, что вам нужно научиться лучше распознавать и понимать, как именно работают компьютеры.
Такой способ поведения компьютеров ведёт ко множеству ошибок. Если вы наберёте console.log — console запятая log, вместо console точка log, JavaScript скажет «Понятия не имею, что ты имел в виду».
Вы будете делать ошибки и ваши программы будут содержать ошибки. Жизнь — она такая. Любой программист делает ошибки и это не имеет особого значения. Значение имеет только то, как вы потом с ними справляетесь.
Исправление ошибок — важный навык. Это делает программирование непохожим на другие типы работ: ошибки неизбежны, вы не можете от них полностью застраховаться, а исправление ошибок — часть вашей работы.
Ошибка вроде «запятая вместо точки» это тип, который проще всего заметить и исправить. Это «синтаксическая ошибка», потому что неверный символ, как запятая в этом случае, нарушает синтаксические правила языка.
Когда вы запускаете код с такой ошибкой, интерпретатор JavaScript — та штука, которая исполняет JavaScript-программы — пожалуется: SyntaxError и укажет вам на то место, где по его мнению есть проблема.
Если вы вызовете ads вместо abs, интерпретатор JavaScript пожалуется: ReferenceError: ads is not defined. Вы использовали, как вам кажется, существующее название, но на самом деле такого названия нет.
Несколько строк, которые следуют после указания ошибки, могут смутить и оттолкнуть вас, но они тут только для пользы. Это stack trace — последовательность вызовов функций, которая привела к ошибке. Когда вы запускаете свою программу, даже крошечную, она становится частью чего-то более крупного — сложной системой JavaScript-кода, который приводится в действие, чтобы оживить вашу программу. Тут видно, что проблема была в моём файле. Следующая строка — это место, откуда был вызван мой код, третья строка — откуда была вызвана вторая и в таком духе можно продолжать дальше. Это как отслеживать шаги в обратном направлении — проблема есть, и мы можем возвращаться по одному шагу назад и смотреть, не нашлась ли ошибка.
Мы допускаем, что вся внутренняя система исправно работает, поэтому ошибка в нашем коде. Когда одна из ваших функций вызывает другую, вы увидите эту последовательность вызовов в стектрейсе.
ReferenceError может случиться с другими константами: например, если ваш код содержит 10 * pi, а pi не существует, потому что вы не создавали константу с точно таким названием, вы получите ReferenceError.
И у нас получилось 32.22222222222222. Не 10. Что произошло? JavaScript не пожаловался, когда код запустился, никаких ошибок не выскакивало.
Компьютер не знает, что нам нужно, поэтому он производит вычисление, как мы его и просили. Но такое вычисление ошибочно — допустили ошибку мы. Нам нужно вначале вычесть 32, а потом умножить это на 5/9. Но мы не использовали скобки, поэтому 32 вначале умножилось на 5/9, а затем результат был отнят от температуры в фаренгейтах.
Это Логическая ошибка. Мы не нарушили никаких правил, мы просто сделали что-то не то. Наш пример был простым: мы написали функцию, запустили её и увидели неверный результат. Но представьте, что функция — это только маленькая частица крупной системы. Приложение для формирования бюджета в огромной организации отправляет отчёт в главную бухгалтерию, что в следующем месяце для оплаты счёта за электричество требуются дополнительные $300 000. Организуется экстренное собрание, увольняют людей, генеральный директор снова уходит в запой. Что случилось?
Иногда обнаружить проблему может оказаться трудной задачей: система кондиционирования ожидает, что январская температура будет 32 градуса по цельсию, вместо 10, потому что кто-то забыл использовать скобки в функции.
Борьба с логическими ошибками — это целиком ваша ответственность. И временами — тяжёлая работа, но в конце приходит сильное облегчение и удовлетворение: а-ааа, так вот в чём была проблема!
Теперь ваша очередь делать ошибки! Выполните тест и упражнение, чтобы ощутить боль.
|
|||||||||||||||||||||||||||||||||||||||||||||||||
Главная » Справочник » Объекты »
|
|||||||||||||||||||||||||||||||||||||||||||||||||
|
Объект ReferenceError представляет ошибку при ссылке на несуществующую переменную.
Syntax
new ReferenceError() new ReferenceError(message) new ReferenceError(message, options) new ReferenceError(message, fileName) new ReferenceError(message, fileName, lineNumber) ReferenceError() ReferenceError(message) ReferenceError(message, options) ReferenceError(message, fileName) ReferenceError(message, fileName, lineNumber)
Примечание: ReferenceError() можно вызывать как с new , так и без него . Оба создают новый экземпляр ReferenceError .
Parameters
-
messageOptional -
Человеческое описание ошибки.
-
optionsOptional -
Объект,обладающий следующими свойствами:
-
causeOptional -
Свойство,указывающее на конкретную причину ошибки.При перехвате и повторном отбрасывании ошибки с более конкретным или полезным сообщением об ошибке это свойство можно использовать для передачи исходной ошибки.
-
-
fileNameOptional Non-standard -
Имя файла,содержащего код,который вызвал исключение.
-
lineNumberOptional Non-standard -
Номер строки кода,вызвавшего исключение
Examples
Поймать ошибку в ссылке
try { let a = undefinedVariable } catch (e) { console.log(e instanceof ReferenceError) console.log(e.message) console.log(e.name) console.log(e.fileName) console.log(e.lineNumber) console.log(e.columnNumber) console.log(e.stack) }
Создание ссылочной ошибки
try { throw new ReferenceError('Hello', 'someFile.js', 10) } catch (e) { console.log(e instanceof ReferenceError) console.log(e.message) console.log(e.name) console.log(e.fileName) console.log(e.lineNumber) console.log(e.columnNumber) console.log(e.stack) }
Specifications
Browser compatibility
| Desktop | Mobile | Server | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | Deno | Node.js | |
ReferenceError |
1 |
12 |
1 |
5.5 |
5 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
See also
Error
JavaScript
-
RangeError() constructor
Конструктор RangeError()создается,когда значение не входит в набор допустимых значений.
-
ReferenceError
Объект ReferenceError представляет текущую область, на которую ссылается, когда несуществующая переменная еще не была инициализирована.
-
Reflect
Reflect-это встроенный объект,который предоставляет методы для взаимодополняемых операций JavaScript.
-
Reflect.apply()
Статический метод Reflect.apply()вызывает целевую функцию с указанными аргументами.


