← Все вопросы

Почему ошибка is not a function в JavaScript и как её исправить?

Задан 13 месяцев назад952 просмотров2 ответа
9

Вызываю метод, а консоль пишет TypeError: x.map is not a function или someFunc is not a function. Хотя функция вроде есть. Из-за чего возникает is not a function и как понять, в чём дело?

2 ответа

13
✓ Принятый ответ — помог автору

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

Причина 1 — метод не подходит типу. Самое частое — .map/.filter на том, что не массив:

const data = { items: [1, 2, 3] };
data.map(x => x);       // TypeError: data.map is not a function (data — объект!)
data.items.map(x => x); // верно — массив внутри

Или ответ сервера оказался строкой/объектом, а ты ждал массив. Проверь Array.isArray(data).

Причина 2 — опечатка в имени метода:

'abc'.toUpercase();  // is not a function — правильно toUpperCase (с большой C)
'abc'.toUpperCase(); // верно

Причина 3 — переменная не функция:

const handler = 5;
handler(); // is not a function — это число

Причина 4 — метод вызван не на том объекте или поле undefined:

const obj = {};
obj.doSomething(); // is not a function — у obj нет такого метода

Как искать: прочитай, что слева от точки в сообщении (x.map → смотри на x) и залогируй его:

console.log(typeof x, Array.isArray(x), x);

Увидишь, что x не то, чем ты его считал. Дальше — либо исправь опечатку метода, либо добейся, чтобы переменная содержала нужный тип (массив/функцию).

5

Отдельная коварная разновидность — когда метода ещё нет, потому что объект собирается асинхронно или библиотека не загрузилась.

Например, обратился к arr.map, а arr пришёл как null/undefined из незавершённого запроса. Подстрахуйся дефолтом:

const list = data.items ?? [];
list.map(x => x * 2); // на пустом массиве не упадёт

И проверь регистр букв в имени метода — JS чувствителен к регистру, getElementByID вместо getElementById тоже даст «is not a function».

Ваш ответ

Войдите, чтобы ответить на вопрос.