0

Ошибка JavaScript: "is not a function"

12

Проблема: "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 ответ(ов)

0

У меня была такая же проблема в Next.js. В файле _app.tsx я забыл обернуть компонент в AuthProvider, где хранились все функции авторизации. Убедитесь, что вы правильно обернули ваш компонент, чтобы функции аутентификации работали корректно.

0

В дополнение к популярным ответам выше, если вы используете файл с сервисами или вспомогательными функциями и выполняете export функций, которые вы позже import в своем проекте, убедитесь, что имя функции, которую вы импортируете, точно совпадает с именем функции, экспортируемой из файла с сервисами, вспомогательными или утилитными функциями — и что такая функция действительно существует в нужном файле! Я столкнулся с этой ошибкой и несколько часов мучился с отладкой, не понимая, в чем дело, пока не выяснил это.

0

Ошибка произошла из-за наличия циклической зависимости, о которой уже упоминали в комментариях @SadSeven и @Manohar Reddy Poreddy. Чтобы быть более конкретным, у меня были два модуля: ModuleA и ModuleB.

В ModuleA была строка:

const FB = require("./ModuleB");

А в ModuleB была строка:

const FA = require("./ModuleA");

Это вызвало ошибку "не является функцией" во время выполнения.

0

Я тоже столкнулся с этой ошибкой. В моем случае корень проблемы был связан с асинхронностью (во время рефакторинга кодовой базы): асинхронная функция, которая создает объект, к которому принадлежит функция "не является функцией", не была ожидаема, и последующая попытка вызвать эту функцию вызывает ошибку, вот пример:

const car = carFactory.getCar();
car.drive() // выбрасывает TypeError: drive is not a function

Решение состояло в следующем:

const car = await carFactory.getCar();
car.drive();

Публикую это на случай, если это может помочь кому-то еще, столкнувшемуся с подобной ошибкой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь