javascript中while变量的声明

时间:2009-11-10 21:05:07

标签: javascript

本质上,我试图在javascript中的while循环的条件部分声明一个变量:

while (var b=a.pop()) {
  do_sth(b)
}

然而,我的浏览器(firefox)不接受这一点。相反,我必须这样:

var b
while (b=a.pop()) {
  do_sth(b)
}

哪个有效。预期会出现这种情况吗?

4 个答案:

答案 0 :(得分:30)

是的,是的。

如果您愿意,可以使用for循环,如下所示:

for (var b; b = a.pop(); ) {      //Note the final semicolon
    do_sth(b);
}

答案 1 :(得分:23)

这个问题有点陈旧,但我认为答案都错过了一个重要的区别。也就是说,while循环需要一个表达式,它可以转换为条件,即布尔值或可以转换为布尔值的值。有关详细信息,请参阅Mozilla docs

纯赋值(没有实例化)通过其默认返回值(右侧的值)强制转换为布尔值。

var(或letconst)是语句,它允许可选的分配,但返回值为undefined

您可以在控制台中轻松测试:

var foo = 42; // undefined
bar = 42      // 42

单独的返回值不会回答这个问题,因为undefined是假的,但确实表明即使JS允许你在条件中放置var,它也只是总是评估为假的。

其他人提到了for语句,它们允许变量的声明和实例化。这是事实,但for while期望声明或分配。

意见可能会有所不同,但对我而言,所有这些都会增加可理解的一致性,而不是循环行为的怪癖。 if循环最好被认为是for语句的循环版本,而不是for循环。如果所有这些都有奇怪之处,那就是$text[10] = 'Doe';语句与语言的正常语法的分歧。

答案 2 :(得分:17)

JavaScript没有块范围。它有功能范围。因此,为了确保人类和JavaScript都以相同的方式读取代码,您应该手动将var声明提升到函数顶部。

以下是JSLint对您的代码的说法:

Problem at line 1 character 8: Expected an identifier and instead saw 'var'.

至少在学习JavaScript时使用JSLint。你会很快学到很多东西。这会伤害你的感情。

答案 3 :(得分:6)

JavaScript没有块范围。因此所有var声明都在函数范围内。因此,在while表达式中声明变量在JavaScript中没有意义。

此外,您应该以分号结束语句。这不是绝对必要的,但强烈建议。