#Что означает ошибка
TypeError: x is not a function
Ошибка TypeError: x is not a function значит, что вы вызываете как функцию значение, которое функцией не является: undefined, объект, строку или результат другой операции. Это самая частая ошибка новичков и при работе с колбэками.
Найдите строку в стеке ошибки, проверьте, что находится в переменной на момент вызова.
Типичные причины: опечатка в имени метода, неправильный импорт, потерянный контекст this и порядок загрузки скриптов.
TypeError: x is not a function в JavaScript значит, что вы вызываете как функцию то, что ею не является: undefined, объект, строка или результат несовместимого API.
Консоль браузера покажет строку.
Нужно понять, чем реально является x.
Ошибка означает вызов значения, не являющегося функцией: опечатка в имени, перезаписанная переменная или неверный объект. Проверьте тип значения через typeof и порядок подключения скриптов.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Опечатка в имени | Свойство написано с неправильным регистром, typeof даёт undefined | Исправьте имя метода по документации библиотеки. |
| Переменная перезаписана | Переменная раньше была функцией, но затем получила строку или объект | Найдите место присваивания по стеку и проверке typeof. |
| Скрипт не загружен | Скрипт с библиотекой вернул 404 или загрузился после вызова | Восстановите правильный путь и порядок выполнения. |
| Неверный объект | Метод вызывается у другого типа данных, например у строки вместо массива | Проверьте тип API-ответа и преобразуйте данные осмысленно. |
#Пошаговое решение
- Прочитайте стекОткройте страницу с ошибкой в браузере и нажмите F12 → «Консоль» (Console). Нажмите на имя файла и номер строки справа от
TypeError: ... is not a function— инструменты разработчика откроют точное место вызова. Если файл минифицирован, используйте форматирование{}либо исходные карты, если они опубликованы. Запишите, какая переменная или свойство вызывается со скобками(). Дляobj.method()важно проверить именноobj.method, а не толькоobj. - Проверьте типПеред проблемной строкой временно вставьте
console.log(typeof obj.method, obj.method)(для своегоobjиmethod) либо установите точку останова слева от строки во вкладке Sources. Запустите страницу заново. Если типundefined, метод не существует или данные ещё не пришли; еслиstring/object, в переменной лежит не функция. Проверяйте значения осторожно: в журналах не должны оказаться токены доступа или персональные данные. После диагностики удалите временный вывод. - Сверьте имя и регистрПроверьте точное имя метода и регистр букв по документации API: например,
getElementById, а неgetElementByID. Если вызываете метод массива, сначала проверьтеArray.isArray(value);forEachне применяется к любому объекту автоматически. Для переменной, полученной от API, посмотрите вкладку Network → Response и учтите, что данные могут иметь другой формат. Исправьте тип данных в источнике либо преобразуйте его осмысленно, а не подавляйте исключение без проверки. - Проверьте импорт/подключениеЕсли ошибка появилась после добавления библиотеки, откройте вкладку Network и убедитесь, что нужный JS-файл загрузился со статусом 200 и правильным типом содержимого. В проекте с модулями сравните
export default/именованныйexportс соответствующимimport; при CommonJS проверьте формуmodule.exports. В HTML со старыми глобальными скриптами проверьте их порядок иdefer, не путайте модульныйtype="module"с глобальными переменными. После исправления перезагрузите страницу с отключённым кэшем и убедитесь, что ошибка исчезла. - Проверьте контекстЕсли передаёте метод объекта как обработчик, проверьте контекст
this: вызовconst f = obj.method; f()может потерять объект. Там, где необходим исходный объект, используйтеobj.method.bind(obj)либо() => obj.method(); это не исправляет ситуацию, еслиobj.methodна самом деле не функция. Повторите действие пользователя и проверьте, что функция выполнилась и данные изменились ожидаемо; если нет, вернитесь к типу значения и стеку ошибки.
#Диагностика
Откройте консоль (F12) и перейдите на строку из ошибки. Выведите значение: console.log(typeof x, x);. Типичные причины: опечатка в имени метода, вызов метода массива у объекта (obj.map), использование .length() вместо .length, импорт по умолчанию вместо именованного (import {fn} и import fn), порядок подключения скриптов.
#Частые случаи
$ is not a function — jQuery не загружен или конфликт версий. x.forEach is not a function — x не массив (используйте Array.from(x)). callback is not a function — не передан обратный вызов. require(...) is not a function — неверный экспорт модуля (module.exports против exports.default). Асинхронные данные: на момент вызова значение ещё undefined.
#Защита
Проверяйте тип: if (typeof fn === "function") fn(); но не применяйте fn?.() к строкам и объектам: необязательная цепочка не проверяет тип функции. Включите TypeScript или JSDoc-проверку. Используйте линтер с правилами no-undef, no-unused-vars. Проверьте версию библиотеки и документацию API.
// Впишите свою переменную вместо obj.method; пример проверки, НЕ универсальное исправлениеconsole.log(typeof obj.method, obj.method);if (typeof obj.method === "function") { obj.method();}#Диагностика
Откройте консоль (F12). В сообщении указано имя и строка. Добавьте перед вызовом console.log(typeof obj.method, obj). Если выводится undefined, метод не существует — проверьте регистр (getElementByID вместо getElementById) и документацию на .
#Типичные причины
Импорт: import foo from "./foo" вместо import { foo } from "./foo"; require модуля, экспортирующего объект. Результат .map() или .filter() вызывается как функция. new пропущен для класса. Метод объекта передан как колбэк и потерял this — используйте стрелочную функцию или .bind(this). Библиотека (jQuery плагин) подключена до jQuery или не подключена.
#Защита
Для необязательных функций используйте if (typeof cb === "function") cb(); или оператор cb?.(). Для асинхронных данных проверяйте, что ответ получен, и не вызывайте методы до загрузки. Включите ESLint с правилом no-undef и TypeScript — они находят такие ошибки до запуска.
// Выполнять только если callback действительно может отсутствоватьif (typeof callback === "function") { callback(result);}