我如何避免;变量可能尚未初始化";当引用JavaScript父对象时?

我如何避免;变量可能尚未初始化";当引用JavaScript父对象时?,javascript,eclipse,warnings,Javascript,Eclipse,Warnings,我知道有很多“如何避免此警告”的问题,但我的问题似乎是针对JavaScript的第一个问题。在本例中,我希望在自己的声明中引用我正在初始化的对象,如下所示: var foo = new Foo({ bar: new Bar({ x: function(){ doStuff(foo); } }); }); (如果这看起来很熟悉,可能您以前使用过ExtJS——这就是他们的大部分内容的构建方式。) 当我调用foo.bar.x()时,我想回到拥有调用函数(x)的条(

我知道有很多“如何避免此警告”的问题,但我的问题似乎是针对JavaScript的第一个问题。在本例中,我希望在自己的声明中引用我正在初始化的对象,如下所示:

var foo = new Foo({
  bar: new Bar({
    x: function(){
      doStuff(foo);
    }
  });
});
(如果这看起来很熟悉,可能您以前使用过ExtJS——这就是他们的大部分内容的构建方式。)

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


所以我不知道如何处理这件事。我应该忽略这个警告吗?有没有办法把它标记成这样,这样我就不会再收到警告了?我做错了吗?我应该以不同的方式传递引用吗?

首先,构建一个Foo。向其构造函数传递一个新的条,该条通过使用变量foo的函数传递

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

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

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

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

Eclipse是对的。如果你想要一个更好的分析系统,可以考虑使用WebS暴3或VisualStudio 11作为JS IDE。应该是
doStuff(foo)
而不是
doStuff(f)
不要使用eclipse。有更好的IDE(WebStorm 3)首先,
foo
被创建为局部变量对象的属性。代码似乎在全局范围内,因此在执行任何代码之前,它是全局对象(全局变量)的属性。调用doStuff时,foo存在,但可能未被赋值(即,它可能未定义)。您是否建议OP的代码将抛出错误?因为它不会。我不是在暗示,我是在解释变量在调用doStuff时不赋值的可能性。我不是说它是,但它是可能的,因此发出警告。在这种情况下,将
foo
声明为属性还是全局并不重要。防止警告的最简单方法是在调用此赋值之前为
foo
赋值(可以为null)。只是声明它不够好(它已声明,但从技术上来说还没有“初始化”),我很难让自己去做类似
var foo=“一些垃圾”;foo=新的foo(…)是的,您可以将其初始化为
null
,但在这一点上,您为了适应IDE而扭曲了编码风格,这是不好的。Javascript不需要为变量赋值(初始化),所以Eclipse很挑剔。通过jslint运行您的代码,看看您得到了什么!!我打算尝试使用JSLint,但它太挑剔了,我需要花费数小时来修复它的所有警告,所以我想先尝试使用Eclipse中的“宽松”警告。我知道这些值不需要初始化,但让您思考可能出现的错误(比如如果初始化代码在条件中)是有价值的,我理解它为什么会抱怨。我只是99%确定,在
foo
未定义的情况下,没有可以调用
x()
的实际执行上下文。是的,
Bar
构造函数将在
Foo
构造函数完成之前完成,但在
Foo
对象完全构造完成之前,似乎没有任何东西可以作用于创建(并分配给
Foo.Bar
Bar对象,此时,
foo
变量被初始化。如果这有什么意义的话……放在一边:VS不是一个选项(尽管我通常是一个粉丝……),因为我是在Linux中开发的。我将认真地看一看WebStorm——谢谢你的提示@编码器我刚才给你们展示了一个上下文,当foo是未定义的时候,x被调用,我对JavaScript还是很生疏,所以在点击之前我不得不重读了十几遍。您的意思是,如果Bar的构造函数在构造过程中调用自己的
x
方法(!!!),那么该方法将尝试使用未定义的
foo
。现在完全有道理了。有没有一种模式可以防止这种情况发生?我想不出一个。@Coderer它叫“不要在声明中引用你自己”。这样做是不好的做法,(除非是像函数一样的简单声明)
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);
    }
  });
});