在引用JavaScript父对象时,如何避免“变量可能尚未初始化”?

时间:2011-10-27 21:55:00

标签: javascript eclipse warnings

我知道有很多“如何避免此警告”的问题,但看起来我的第一个特定于JavaScript。在这种情况下,我想在其自己的声明中引用我正在初始化的东西,如下所示:

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

(如果这看起来很熟悉,也许你以前使用过ExtJS - 这就是他们大部分内容的构建方式。)

当我致电foo.bar.x()时,我想回到拥有调用该函数(foo)的Bar(bar)的Foo(x)。这有效,但我的Eclipse警告我“foo可能尚未初始化”,引用了对doStuff();的调用 - 因为,当引擎第一次看到该行时,我们还没有完成对foo的定义然而。当然,除非成功构建x(),否则无法调用foo,但我的样式检查器显然没有想到这一点。

所以我对如何应对这种情况感到茫然。我应该忽略这个警告吗?有没有办法将它标记为这样,所以我不再收到警告了?我做错了吗?我应该以不同的方式传递我的参考资料吗?

4 个答案:

答案 0 :(得分:2)

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。

答案 1 :(得分:1)

这与javascript无关,但可能与Eclipse有关。变量 foo 可以在任何地方声明,因为变量声明在执行任何代码之前都会被处理。它也可以在调用 doStuff 之前的任何时候初始化(虽然初始化变量而不声明它们被视为错误形式)。

答案 2 :(得分:0)

首先,构建一个Foo。对于它的构造函数,传递一个新的Bar,它使用变量foo传递一个函数。

但只有在Foo的构造函数完成后才会为foo分配一个值。此时,已使用未声明的变量foo声明该函数。 如果在Bar或Foo的构造函数中使用该函数,它将失败。

答案 3 :(得分:0)

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

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