在引用 JavaScript 父对象时如何避免"variable may not have been initialized"?



我知道有很多"如何避免此警告"的问题,但看起来我的是第一个特定于JavaScript的问题。在本例中,我想在的声明中引用我要初始化的,就像这样:

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

(如果这看起来很熟悉,也许你以前使用过ExtJS——这是他们的大多数东西是如何构建的。)

当我调用foo.bar.x()时,我想指向拥有调用函数(x)的Bar (bar)的Foo (foo)。这可以工作,但是我的Eclipse警告我"foo可能还没有初始化",引用对doStuff();的调用——因为当引擎第一次看到这行时,我们还没有完成对foo的定义。当然,x()不能被调用,除非foo被成功构造,但是我的风格检查器显然没有发现这一点。

所以我不知道如何处理这个问题。我应该忽略这个警告吗?有没有办法把它标记成这样,这样我就不会再收到警告了?我做错了吗?我是否应该以另一种方式递交我的推荐信?

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);
    }
  });
});

Eclipse是正确的如果你想要一个更好的分析系统,可以考虑使用WebStorm 3.0或Visual Studio 11作为你的JS IDE。

这与javascript无关,但可能与Eclipse有关。变量foo可以在任何地方声明,因为变量声明是在执行任何代码之前处理的。它也可以在调用doStuff之前的任何时间初始化(尽管不声明变量的初始化被认为是不好的形式)。

首先构造一个Foo。将一个新的Bar传递给它的构造函数,该函数使用变量foo传递给它。

但是foo只有在foo的构造函数完成后才赋值。此时,已经使用未声明的变量foo声明了函数。如果在Bar或Foo的构造函数中使用该函数,则会失败。

我认为@RobG是对的,这是一个Eclipse问题,最好处理它。但是如果您想避免它,您可以在初始化foo之前声明它,我打赌这将使Eclipse不会抱怨:

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

相关内容

最新更新