for for循环 - for(;;)

时间:2011-01-19 21:28:46

标签: javascript

我正在探索Google Closure Compiler,我注意到的一件事是它将while(true)转换为for(;;)

两者都挂起浏览器,但为什么空的for循环不会立即中断?它的第二部分是空的,因此是假的。当第二部分是假的时候,for循环停止并继续执行for循环之后的代码,这是不是真的?

有人可能会对此作出解释吗?

4 个答案:

答案 0 :(得分:21)

不,这不是真的。

请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

  

条件

     

在每次循环迭代之前要计算的表达式。如果这   表达式求值为true,   声明被执行。这个   条件测试是可选的。 如果   省略,条件总是   评估为真。如果表达   评估为false,执行跳过   for之后的第一个表达式   构造

我或许应该提供ECMAScript参考的链接,但我很确定它或多或少地说明了相同的内容。

答案 1 :(得分:4)

来自ECMAScript language specification

IterationStatement:for(ExpressionNoIn_opt; Expression_opt; Expression_opt)Statement

如果存在第一个表达式,那么

  1. 让testExprRef成为评估第一个Expression的结果。
  2. 如果GetValue(testExprRef)为false,则返回(normal,V,empty)。
  3. 由于第一个表达式(for的第二个参数)不存在,因此该部分永远不会运行,因此for循环不会退出。

答案 2 :(得分:1)

空的中间部分应该被解释为true,所以它不是假的。它在C语言和其他语言中具有相同的语义,具有这种循环(如C#,Java等)。为JavaScript改变它将是一个真正的陷阱。

答案 3 :(得分:1)

在标准ECMA-262脚本中有for循环的评估算法,它表示只有两种情况会循环结束:

  1. break statement
  2. 中间语句的值等于 false 但仅当此语句存在时,因此不必将其评估为 true (可能是在mozilla js引擎中)。