我知道有很多“如何避免此警告”的问题,但看起来我的第一个特定于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
,但我的样式检查器显然没有想到这一点。
所以我对如何应对这种情况感到茫然。我应该忽略这个警告吗?有没有办法将它标记为这样,所以我不再收到警告了?我做错了吗?我应该以不同的方式传递我的参考资料吗?
答案 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);
}
});
});