Почему иногда моя функция JavaScript “не определена”?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
39
задан Peter Mortensen 12 August 2011 в 10:47
поделиться

9 ответов

Для этого не должно быть возможно произойти, если Вы просто включаете сценарии на странице.

функция "copyArray" должна всегда быть доступной, когда код JavaScript начинает выполняться, неважно, если это объявляется прежде или после него - если Вы не загружаете файлы JavaScript в динамично с библиотекой зависимости. Существуют все виды проблем с синхронизацией, если это так.

8
ответ дан Peter Mortensen 27 November 2019 в 02:49
поделиться

Мое предположение, так или иначе документ не полностью загружается к тому времени, когда метод называют. Имейте свой код, выполняющийся после того, как документ будет готовым событием.

4
ответ дан Per Hornshøj-Schierbeck 27 November 2019 в 02:49
поделиться

Проверьте свой код с JSLint. Это будет обычно находить тонну небольших ошибок, таким образом, предупреждение "JSLint сможет задеть Ваше самолюбие", является довольно точечным на. =)

4
ответ дан Peter Mortensen 27 November 2019 в 02:49
поделиться

Синтаксическая ошибка в функции - или в коде выше его - может заставить его быть неопределенным.

2
ответ дан James Curran 27 November 2019 в 02:49
поделиться

Это не решает Вашу исходную проблему, но Вы могли всегда заменять вызов к copyArray() с:

__args = Array.prototype.slice.call(arguments);
[еще 114] информация, доступная от Google .

, я протестировал вышеупомянутое в следующих браузерах: IE6, 7 & 8B2, Firefox 2.0.0.17 & 3.0.3, Opera 9.52, Safari для Windows 3.1.2 и Google Chrome (независимо от того, что последняя версия была во время этого сообщения) и это работает через все браузеры.

2
ответ дан Grant Wagner 27 November 2019 в 02:49
поделиться

При изменении прототипа встроенного 'функционального' объекта, возможно, что Вы сталкиваетесь с ошибкой браузера или состоянием состязания путем изменения фундаментального встроенного объекта.

Тест это в нескольких браузерах для обнаружения.

2
ответ дан Peter Mortensen 27 November 2019 в 02:49
поделиться

Используйте анонимную функцию для защиты локальной таблицы символов. Что-то как:

(function() {
    function copyArray(pa) {
        // Details
    }

    Function.prototype.bind = function ( po ) {
        __args = copyArray( arguments );
    }
})();

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

0
ответ дан JJJ 27 November 2019 в 02:49
поделиться

Я боюсь, когда Вы добавляете новый метод к Функциональному классу (prtotyping), Вы на самом деле добавляете его ко всем заявленным функциям, А ТАКЖЕ к Вашему copyArray (). В результате Ваш copyArray () рекурсивно самоссылаются на функцию. Т.е. там должен существовать copyArray () .bind () метод, который называет себя.

В этом случае некоторые браузеры могли бы препятствовать тому, чтобы Вы создали такие ссылочные циклы, и запустить "функцию не определенная" ошибка.

Встроенный код был бы лучшим решением в таком случае.

0
ответ дан user965641 27 November 2019 в 02:49
поделиться

У меня эта функция не распознавалась как определенная в последней версии Firefox для Linux, хотя Chromium с этим справлялся.

В моем случае произошло то, что у меня был предыдущий блок SCRIPT перед блоком, который определял функцию с проблемой, сформулированную следующим образом:

<SCRIPT src="mycode.js"/>

(То есть без закрывающего тега .)

Мне пришлось заново объявить этот блок следующим образом.

<SCRIPT src="mycode.js"></SCRIPT>

То, что было дальше, сработало нормально ... странно, да?

21
ответ дан 27 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: