Ошибка JavaScript: "is not a function"
Проблема: "API.LMSInitialize is not a function"
Я столкнулся с распространенной проблемой в JavaScript: ошибка "не является функцией", но после изучения множества тем на эту тему, так и не смог понять, в чем дело в моем случае.
У меня есть пользовательский объект, определенный следующим образом:
function Scorm_API_12() {
var Initialized = false;
function LMSInitialize(param) {
errorCode = "0";
if (param == "") {
if (!Initialized) {
Initialized = true;
errorCode = "0";
return "true";
} else {
errorCode = "101";
}
} else {
errorCode = "201";
}
return "false";
}
// недостающие функции опущены.
}
var API = new Scorm_API_12();
В другом скрипте я пытаюсь использовать этот API следующим образом:
var API = null;
function ScormProcessInitialize(){
var result;
API = getAPI();
if (API == null){
alert("ERROR - Не удалось установить соединение с API.");
return;
}
// и здесь появляется пресловутая ошибка
result = API.LMSInitialize("");
// дополнительный код опущен
initialized = true;
}
Функция getAPI()
выглядит следующим образом:
var findAPITries = 0;
function findAPI(win) {
while ((win.API == null) &&
(win.parent != null) &&
(win.parent != win)) {
findAPITries++;
if (findAPITries > 7) {
alert("Ошибка при поиске API — слишком глубокая вложенность.");
return null;
}
win = win.parent;
}
return win.API;
}
function getAPI() {
var theAPI = findAPI(window);
if ((theAPI == null) &&
(window.opener != null) &&
(typeof(window.opener) != "undefined")) {
theAPI = findAPI(window.opener);
}
if (theAPI == null) {
alert("Не удалось найти адаптер API");
}
return theAPI;
}
Судя по всему, API был найден, так как я не получаю сообщение "Не удалось найти...", и код продолжает попытку его инициализации. Однако Firebug сообщает мне, что API.LMSInitialize is not a function
, и если я попытаюсь отладить это с помощью alert(Object.getOwnPropertyNames(API));
, он выдаст мне пустое сообщение.
Что я упускаю?
4 ответ(ов)
У меня была такая же проблема в Next.js. В файле _app.tsx я забыл обернуть компонент в AuthProvider, где хранились все функции авторизации. Убедитесь, что вы правильно обернули ваш компонент, чтобы функции аутентификации работали корректно.
В дополнение к популярным ответам выше, если вы используете файл с сервисами или вспомогательными функциями и выполняете export
функций, которые вы позже import
в своем проекте, убедитесь, что имя функции, которую вы импортируете, точно совпадает с именем функции, экспортируемой из файла с сервисами, вспомогательными или утилитными функциями — и что такая функция действительно существует в нужном файле! Я столкнулся с этой ошибкой и несколько часов мучился с отладкой, не понимая, в чем дело, пока не выяснил это.
Ошибка произошла из-за наличия циклической зависимости, о которой уже упоминали в комментариях @SadSeven и @Manohar Reddy Poreddy. Чтобы быть более конкретным, у меня были два модуля: ModuleA и ModuleB.
В ModuleA была строка:
const FB = require("./ModuleB");
А в ModuleB была строка:
const FA = require("./ModuleA");
Это вызвало ошибку "не является функцией" во время выполнения.
Я тоже столкнулся с этой ошибкой. В моем случае корень проблемы был связан с асинхронностью (во время рефакторинга кодовой базы): асинхронная функция, которая создает объект, к которому принадлежит функция "не является функцией", не была ожидаема, и последующая попытка вызвать эту функцию вызывает ошибку, вот пример:
const car = carFactory.getCar();
car.drive() // выбрасывает TypeError: drive is not a function
Решение состояло в следующем:
const car = await carFactory.getCar();
car.drive();
Публикую это на случай, если это может помочь кому-то еще, столкнувшемуся с подобной ошибкой.
Длина объекта в JavaScript
Как проверить, является ли объект массивом?
Как правильно клонировать объект в JavaScript?
Как перебирать объект в JavaScript?
Как вернуть значение из асинхронной функции обратного вызова?