在if语句中使用未定义的变量

时间:2009-02-24 11:46:49

标签: javascript

此代码段会导致JavaScript运行时错误:(foo未定义)

if (foo) {
    // ...
}

我必须首先定义foo,如下所示:

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

......只有这样才能做到:

if (foo) {
    // ...
}

为什么?


更新

这对我来说有点像脑子里的事情:'fcourse你无法访问未分配的变量。

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

6 个答案:

答案 0 :(得分:21)

我觉得你在问,因为你知道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
    // ...
}

希望能稍微清理一下。

答案 1 :(得分:15)

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

如果必须,调试问题或其他什么,你可以检查变量是否未定义如下:

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

答案 2 :(得分:1)

那是因为你现在用以下方式定义它:

var foo = foo || null

为什么不首先定义它?对我来说这似乎很简单(除非我遗漏了什么)。

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

答案 3 :(得分:0)

这对我来说似乎很奇怪。让我们说我想调用一个函数: -

东西();

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

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

答案 4 :(得分:0)

我觉得这个问题有点奇怪。为了回答这个问题,我认为最好以相反的方式提出这个问题......

的预期结果是什么?
if (foo) {
    // ...
}

其中foo未定义为变量?

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

向您提出一个更直接的问题,为什么您希望代码能够工作,这些代码指的是不存在且未分配值的变量?你在上面定义的上下文中foo是什么?

底线是没有声明,后续声明没有任何意义。 foo不是一个可以自己评估的术语,所以你必须给解释器一个上下文来引用foo,这样它就可以对它进行评估。

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

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

答案 5 :(得分:0)

这不是一个奇怪的问题因为我在同一条船上:p

我在google搜索“javascript use variable undefined”后到达这里。我迷茫了因为我在某个地方看到人们可以简单地在循环中使用未定义的变量。

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

我找到了。第一个代码成功执行,而第二个代码运行时错误。

第一个代码:

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

第二代码:

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