2009-11-10 91 views
18

从本质上说,我想申报while循环的条件部分的变量在javascript:声明中,而条件变量在JavaScript

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

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

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

哪些工作。预期这种行为?

+1

下面的2解释了变量声明的提升,但并没有解释为什么你不能在'while'条件中声明一个变量(但你可以,例如,在'for'条件下)。你有没有找到一个很好的解释呢? – Barney 2014-03-04 11:03:45

+2

另一个JS怪癖,这就是为什么。 – 2014-12-17 10:13:50

回答

16

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

这里是JSLint说,关于你的代码:

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

使用的JSLint,至少当你学习JavaScript。你会很快学到很多东西。它会伤害你的感情。

+0

这不再是这种情况,让我 – Ced 2016-12-25 03:30:30

23

是的。

如果你愿意,你可以使用一个for循环,就像这样:

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

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

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

16

这个问题有点过时了,但我认为答案都会错过一个重要的区别。也就是说,while循环期望表达式,其被蒸发为条件的,即可以被转换为布尔值的布尔值或值。详情请参阅Mozilla docs

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

一个var(或letconst)是声明,允许一个可选的分配,但有undefined返回值。单独

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

返回值不回答这个问题,因为undefined是falsey,但也表明,即使JS让你把一个var在:

您可以在控制台轻松地测试此有条件的,它总是会评估为false。

其他人提到了for语句,并且它们允许声明和实例化变量。这是真的,但for期待一个声明或assigment documentation explains

意见可能会有所不同,但对于我来说,所有这些都增加了一个可理解的一致性,而不是循环中行为的怪癖。A while循环更好地被认为是if语句的循环版本,而不是类似于for循环。如果在所有这些方面都有些怪异的话,那么它就是语言与语言正常语法的完全不同。

+2

我在找'为什么?' JavaScript不允许const,let,var,而条件和这回答了我的问题。我总是发现令人困惑的是,当我创建一个新变量而不是变量的值时,控制台报告未定义。 我仍然没有看到JavaScript的点返回undefined;他们也可以返回变量的值,但是如果它返回undefined,更好的浏览器和编译器在条件中使用时会出错。 – 2017-07-29 21:30:34