Как избежать «переменная, возможно, не была инициализирована» при обращении к родительскому объекту JavaScript? - PullRequest
5 голосов
/ 28 октября 2011

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

var foo = new Foo({
  bar: new Bar({
    x: function(){
      doStuff(foo);
    }
  });
});

(Если это выглядит знакомым, возможно, вы использовали ExtJS раньше- так строится большинство их вещей.)

Когда я звоню foo.bar.x(), я хочу указать на Foo (foo), которому принадлежит Бар (bar), который вызываетфункция (x).Это работает, но мой Eclipse предупреждает меня, что «foo, возможно, не был инициализирован», ссылаясь на вызов doStuff(); - потому что, когда движок впервые видит строку, мы еще не закончили определение foo.Конечно, x() не может быть вызван, если foo не будет успешно построен, но моя программа проверки стиля, по-видимому, не поняла это.

Так что я не знаю, как с этим справиться,Должен ли я игнорировать предупреждение?Есть ли способ пометить его как таковой, чтобы я больше не получал предупреждение?Я делаю это неправильно?Должен ли я передать свою ссылку другим способом?

Ответы [ 4 ]

2 голосов
/ 28 октября 2011
var Foo = function() { }

var Bar = function (obj) {
  // foo is not initialized
  obj.x();
  // called doStuff with undefined
}

var foo = new Foo({
  bar: new Bar({
    x: function(){
      doStuff(foo);
    }
  });
});

Затмение верно.Опять же, если вам нужна более совершенная система анализа, рассмотрите возможность использования WebStorm 3.0 или Visual Studio 11 в качестве JS IDE.

1 голос
/ 28 октября 2011

Это не имеет ничего общего с Javascript, но, вероятно, что-то делать с Eclipse. Переменная foo может быть объявлена ​​где угодно, поскольку объявления переменных обрабатываются до выполнения любого кода. Его также можно инициализировать в любое время до вызова doStuff (хотя инициализация переменных без их объявления считается плохой формой).

0 голосов
/ 28 октября 2011

Я думаю, что @RobG прав, что это проблема Eclipse, и, вероятно, лучше всего с ней справиться. Но если вы хотите избежать этого, вы можете объявить foo перед тем, как инициализировать его, и я уверен, что это не даст Eclipse жаловаться:

var foo;
foo = new Foo({
  bar: new Bar({
    x: function(){
      doStuff(foo);
    }
  });
});
0 голосов
/ 28 октября 2011

Сначала строится Foo. Его конструктору передается новый Bar, которому передается функция с использованием переменной foo.

Но foo присваивается значение только после завершения конструктора Foo. На этом этапе функция уже объявлена ​​с использованием необъявленной переменной foo. Если функция используется в конструкторе Bar или Foo, она потерпит неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...