2012-03-30 211 views
5

世界上正在使第二个参数返回true为什么'for(;;)'循环?

警告:它会无限循环,并可能会崩溃浏览器

for(;;){ 
    //... 
} 

我完全期待不循环在所有...

但它正在运行,这会让情况变得更糟,因为只有在评估结果为true时才能运行,或者我错过了什么?

+3

如果完全没有条件,for循环会一直运行,直到你打破它为止。这与C相同。 – 2012-03-30 03:21:10

+0

请参阅http://stackoverflow.com/questions/4894120/special-for-loop-syntax/4894256#4894256 - 在Java和JavaScript中与在C和C++中一样。 – paxdiablo 2012-03-30 03:25:22

回答

7

forMDN

for ([initialization]; [condition]; [final-expression]) 
    statement 

[Initialization][final-expression]被直观地不是必需的,减少了构建体对一个简单的while循环。但相关的部分是:

条件
的表达式以每次循环迭代之前进行评估。如果此表达式的计算结果为true,则执行语句。 此条件测试是可选的。如果省略,则条件始终为真。如果表达式计算结果为false,则执行跳到for结构之后的第一个表达式。

(重点煤矿)

这似乎是一个完全任意JS语言的设计决策。如果这是我的语言,我可能会引发语法错误。


在一个好玩侧面说明,for(;;){}相当于while(true){},并且正好是4个字符短。我想知道是否缩小者利用这个!

+0

很好的参考,我完全信任该网站的每一个字 – ajax333221 2012-03-30 03:33:44

4

因为条件的缺乏总是评估为真。

+0

真的吗?这是一种嗜好。它是如何在Java中无处不在的?正如'if()'中那样? – 2012-03-30 03:23:39

+0

@RobertHarvey,语法防止'if()'没有条件,但它不能阻止'for()'。 – rid 2012-03-30 03:25:46

1

没有什么“使第二个参数返回true”。没有第二个参数。 ECMAScript Language Specification (ECMA-262 5th Edition)的12.6.3节说这个:

a。如果第一个表达式存在,则

i。假设testExprRef是评估第一个 表达式的结果。

ii。如果的GetValue(testExprRef)是,收益率(normalVempty)。

“第一表达”它指的是for语句的分号之间的可选表达式。如果存在,程序执行上面引用的步骤(i)和(ii)。如果该表达式不存在,则该程序根本不执行for语句算法的步骤(i)和(ii)。