TypeError: "x" не является функцией
Исключение JavaScript "is not a function" возникает, когда была предпринята попытка вызвать значение из функции, но это значение на самом деле не является функцией.
Сообщение
TypeError: "x" is not a function. (V8-based & Firefox & Safari)
Тип ошибки
Что пошло не так?
Была предпринята попытка вызвать значение из функции, но это значение на самом деле не является функцией. Какой-то код ожидает, что вы предоставите функцию, но этого не произошло.
Возможно, в названии функции есть опечатка? Возможно, у объекта, у которого вы вызываете метод, нет этой функции? Например, JavaScript Objects не имеет функции map, а объект JavaScript Array — имеет.
Есть много встроенных функций, которым требуется (обратный вызов) функция. Вам придется предоставить функцию, чтобы эти методы работали должным образом:
- При работе с объектами
ArrayилиTypedArray: - При работе с объектами
MapиSet:
Примеры
Опечатка в названии функции
В этом случае, что случается слишком часто, в названии метода есть опечатка:
const x = document.getElementByID("foo");
// TypeError: document.getElementByID is not a function
Правильное название функции — getElementById:
const x = document.getElementById("foo");
Функция вызвана у неверного объекта
Для некоторых методов вам нужно предоставить (обратный вызов) функцию, и она будет работать только с определенными объектами. В этом примере используется Array.prototype.map(), который работает только с объектами Array.
const obj = { a: 13, b: 37, c: 42 };
obj.map((num) => num * 2);
// TypeError: obj.map is not a function
Вместо этого используйте массив:
const numbers = [1, 4, 9]; numbers.map((num) => num * 2); // [2, 8, 18]
Функция имеет то же имя, что и существующее свойство
Иногда при создании класса вы можете иметь свойство и функцию с одинаковым именем. При вызове функции компилятор считает, что функция перестает существовать.
function Dog() {
this.age = 11;
this.color = "black";
this.name = "Ralph";
return this;
}
Dog.prototype.name = function (name) {
this.name = name;
return this;
};
const myNewDog = new Dog();
myNewDog.name("Cassidy"); // TypeError: myNewDog.name is not a function
Вместо этого используйте другое имя свойства:
function Dog() {
this.age = 11;
this.color = "black";
this.dogName = "Ralph"; // Using this.dogName instead of .name
return this;
}
Dog.prototype.name = function (name) {
this.dogName = name;
return this;
};
const myNewDog = new Dog();
myNewDog.name("Cassidy"); // Dog { age: 11, color: 'black', dogName: 'Cassidy' }
Использование скобок для умножения
В математике 2 × (3 + 5) можно записать как 2*(3 + 5) или просто 2(3 + 5).
Использование последнего варианта вызовет ошибку:
const sixteen = 2(3 + 5);
console.log(`2 x (3 + 5) is ${sixteen}`);
// Uncaught TypeError: 2 is not a function
Вы можете исправить код, добавив оператор *:
const sixteen = 2 * (3 + 5);
console.log(`2 x (3 + 5) is ${sixteen}`);
// 2 x (3 + 5) is 16
Правильный импорт экспортированного модуля
Убедитесь, что вы правильно импортируете модуль.
Пример библиотеки вспомогательных функций (helpers.js)
function helpers() {}
helpers.groupBy = function (objectArray, property) {
return objectArray.reduce((acc, obj) => {
const key = obj[property];
acc[key] ??= [];
acc[key].push(obj);
return acc;
}, {});
};
export default helpers;
Правильное использование импорта (App.js):
import helpers from "./helpers";
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Not_a_function