Свойство объекта всегда неопределено - PullRequest
0 голосов
/ 05 июля 2010

Я впервые использую объекты JS, и меня смущает вопрос, почему это свойство всегда неопределено:

function Rotator() {
    this.interval = 300;
    this.image = 0;
    this.images = undefined;
}

Rotator.prototype.Fetch = function(links) {
    console.log("Fetch called");
    this.images = links;
}

Rotator.prototype.Current = function() {
    if (this.images == undefined) {
        console.log("Error, images is undefined");
    }
    return this.images[this.image];
}

r = new Rotator;
$.getJSON("./data.php", function (data) {
    r.Fetch(data.images);
});

console.log(r.Current());

Я получаю ошибку:

Uncaught TypeError: Невозможно прочитать свойство '0' из неопределенного

Возвращенный JSON работает нормально, и выборка помечается как вызванная в консоли (при регистрации также хорошо обрабатываются данные).Почему Rotator.images всегда не определен?

Редактировать: Некоторые результаты console.log:

  • Запись data.images в $.getJSON приводит к правильным данным.
  • Запись links в Fetch приводит к правильным данным.
  • Запись this.images в Fetch приводит к правильным данным.
  • Запись this.images в Current приводит к нулю.

Ответы [ 3 ]

2 голосов
/ 05 июля 2010

Поскольку получение JSON является асинхронным, поэтому данные доступны только в функции обратного вызова.

$.getJSON("./data.php", function (data) { // callback function
    r.Fetch(data.images); // this will run when the data is available
});

console.log(r.Current()); // this will run immediately -> data.images is null

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

0 голосов
/ 05 июля 2010

Это принесет мне пуристы на шею или это приемлемо?

Rotator.prototype.Current = function() {
    if (this.images) return this.images[this.image];
    console.log("Error, images is undefined, null, empty or 0");
}
0 голосов
/ 05 июля 2010

Вы не можете использовать undefined таким образом. Используйте null вместо:

this.images = null;

и

if (this.images == null) {

Edit:

Вы также должны избегать использования свойства images, если оно равно null:

Rotator.prototype.Current = function() {
  if (this.images == null) {
    console.log("Error, images is undefined");
    return null;
  }
  return this.images[this.image];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...