2009-02-24 39 views
10

这段代码导致的JavaScript运行时错误:(没有定义foo使用不确定变量的if语句

if (foo) { 
    // ... 
} 

我必须首先定义foo,就像这样:

var foo = foo || null // or undefined, 0, etc. 

...然后才能这样做:

if (foo) { 
    // ... 
} 

这是为什么?


更新:

这是有点在我身边的事情一brainfart的:“fcourse您无法访问未分配的变量。

有趣的东西,你可以做一个typeof()在一个未定义的变量你。我会接受miccet的回答,因为我认为这是最优雅的解决方案。

+0

[这](http://2ality.com/2013/04/check-undefined.html)2ality文章提到不同的推荐检查_undefined_的方法,包括在布尔上下文中将其解释为_falsy_。 – martieva 2017-06-20 13:44:39

回答

11

你必须定义它,才能检查它的值。在这种情况下,你正在检查天气是否属实。这个变量显然没有设置任何东西,例如C#中的null和VB中的Nothing。

如果你一定要,调试问题或什么的,如果变量未定义这样你可以检查:

if (typeof(variable) == "undefined") 
+0

不错的小片段。十分优雅。请牢记这一点。 奇怪的是,你可以对未定义的变量做一个typeof(),但不能:if(undefinedVariable!== null)。 – roosteronacid 2009-02-24 11:55:35

+1

是的,我发现这个很方便。我想这是因为你看起来像它而不是它,如果这是有道理的。 – miccet 2009-02-24 12:00:21

1

那将是因为你现在定义它:

var foo = foo || null 

你为什么不首先定义它?这对我来说似乎很简单(除非我错过了某些东西)。

在创建(或设置为某个)之前使用变量是不好的编程习惯,应该避免。我的建议是而不是使用该技巧来确保它被设置为某种东西,但追查逻辑错误并修复它。

0

对我来说这似乎很奇怪的问题。假设我想调用一个函数: -

thing();

如果事情没有定义在任何地方,我会期望它失败。

为什么你希望使用一个名为foo的变量而不在代码中的任何位置定义它?

18

我觉得你问,因为你知道JavaScript似乎允许未定义的变量在某些情况下(即没有运行时错误),而不是在其他人。

的理由如下:JavaScript的总是上检查未定义的变量抛出一个错误,但绝不检查未定义性能,只要您只使用一层间接引发错误。

例子:

// throws runtime error 
if(foo) { 
    // ... 
} 

// does not throw runtime error 
if(window.foo) { 
    // ... 
} 

// does not throw runtime error 
var obj = {}; 
if(obj.foo) { 
    // ... 
} 

// throws runtime error 
if(obj.foo.bar) { // going two levels deep, but foo is undefined 
    // ... 
} 

。希望清除它一点。

0

我觉得这有点奇怪的问题。要回答这个问题,我认为这是最好要问的问题倒过来...

会是什么

if (foo) { 
    // ... 
} 

其中foo没有被定义为一个变量预期的结果?

我认为唯一可能的答案是,如果总是评估为假,你永远不会执行该块。

问你一个更直接的问题,你为什么期望代码能够工作,哪些是指那些不存在并且没有赋值的变量?在上面定义的上下文中,foo是什么?

底线是没有声明后面的声明没有任何意义。 foo不是一个可以独立评估的术语,所以你必须给解释者一个参考foo的上下文,以便它可以评估它。

有些语言会在您首次分配时为您自动创建变量(python和VB共享该危险特性),但即使这些语言在赋值之前也无法评估变量,所以解释器会抛出错误。

如果你有一个编译器它会告诉你这也太......

0

这不是一个奇怪的问题怎么把我在同一条船上:P

我在Google上搜寻后到达这里“ JavaScript使用变量未定义“。我感到困惑,因为我在某处看到人们可以简单地在循环中使用未定义的变量。

也许我看到了它在不同的语言


我发现它。第一个代码成功执行,而第二个代码运行时错误。

第一代码:

test(); 
function test() { x = 4; } 
console.log(x); //this produce 4 

第二代码:

test(); 
function test() { x[0] = 1; } 
console.log(x[0]);