Повідомлення
TypeError: "x" не є функцією
Тип помилки
Що пішло не так?
Була спроба викликати значення з функції, але значення насправді не є функцією. Деякий код очікує, що ви надішлете функцію, але це не відбулося.
Можило в назві функції є опечатка? Можливо метод, що викликаєтся на об'єкті не має цієї функції? Наприклад, об'єкти JavaScript не мають функції map
, але об'єкт масиву JavaScript має.
Є багато вбудованих функцій, які потребують функцій зворотнього виклику. Вам доведеться надати функцію, щоб ці методи працювали належним чином:
- Коли працюєте з
Array
абоTypedArray
об'єктами: - Коли працюєте з
Map
іSet
об'єктами:
Приклади
Помилка в назві фунції
В цьому випадку, що трапляється занадто часто, в назві методу є помилка:
var x = document.getElementByID('foo');
// TypeError: document.getElementByID is not a function
Правильна назва функції є getElementById
:
var x = document.getElementById('foo');
Функція, що викликана на неправильному об'єкті
Для деяких методів вам необхідно надати функцію зворотнього виклику, і вона буде працювати тільки на певних об'єктах. Наприклад, використано Array.prototype.map()
, який буде працювати лише з об'єктом Array
.
var obj = {a: 13, b: 37, c: 42};
obj.map(function(num) {
return num * 2;
});
// TypeError: obj.map is not a function
Використовуйте замість цього масив:
var numbers = [1, 4, 9];
numbers.map(function(num) {
return num * 2;
});
// Array [2, 8, 18]
Функція має назву, що співпадає з існуючою раніш властивістю
Іноді під час створення класу ви можете мати властивість та функцію з тим самим ім'ям. Після виклику функції компілятор вважає, що функція перестає існувати.
var Dog = function () {
this.age = 11;
this.color = "black";
this.name = "Ralph";
return this;
}
Dog.prototype.name = function(name) {
this.name = name;
return this;
}
var myNewDog = new Dog();
myNewDog.name("Cassidy"); //Uncaught TypeError: myNewDog.name is not a function
Використовуйте інше ім'я властивості:
var Dog = function () {
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;
}
var myNewDog = new Dog();
myNewDog.name("Cassidy"); //Dog { age: 11, color: 'black', dogName: 'Cassidy' }