【问题标题】:Why does this 'for(;;)' loops?为什么这个 'for(;;)' 循环?
【发布时间】:2012-03-30 03:20:24
【问题描述】:

到底是什么让第二个参数返回true

警告:它会无限循环并可能导致您的浏览器崩溃

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

我完全希望不要循环......

但它正在运行,这让情况变得更糟,因为它只能在评估为 true 的情况下运行,或者我错过了什么?

【问题讨论】:

标签: javascript loops infinite-loop


【解决方案1】:

来自forMDN

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

[Initialization][final-expression] 直观地不需要,将构造简化为简单的 while 循环。但相关部分是:

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

(强调我的)

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


有趣的是,for(;;){} 等同于 while(true){},并且恰好短了 4 个字符。我想知道缩小器是否利用了这一点!

【讨论】:

    【解决方案2】:

    因为缺少条件总是会评估为真。

    【讨论】:

    • 真的吗?这有点胡闹。这就是它在 Java 中无处不在的工作方式吗?如if() ?
    • @RobertHarvey,语法可以防止if() 没有条件,但它不会阻止for()
    【解决方案3】:

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

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

    我。令 testExprRef 为第一个求值的结果 表达式

    二。如果 GetValue(testExprRef) 为 false,则返回 (normal, V, empty)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 2012-01-17
      相关资源
      最近更新 更多