2011-01-19 109 views
10

我正在探索Google Closure Compiler,我注意到的一件事是它將while(true)轉換爲for(;;)空循環 - for(;;)

兩者都會掛起瀏覽器,但爲什麼空的for循環不會立即崩潰?它的第二部分是空的,因此是錯誤的。是不是真的,當第二部分是虛假的,for循環停止並繼續執行for循環後面的代碼?

有人可能會給這個解釋嗎?

+2

也許它的速度更快......應該有人標杆他們:) – 2011-01-19 21:38:11

+2

那麼,它的體積更小 - 這是編譯器做什麼:剛剛涅槃你的代碼(這是一個偉大的工具,真的) – pimvdb 2011-01-19 21:39:38

回答

20

不,這是不正確的。

參見:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

條件

的表達式以每次循環迭代之前進行評估。如果此 表達式的計算結果爲真,則執行 語句。這個 條件測試是可選的。 如果省略了 ,條件總是 的計算結果爲真。如果表達式 的計算結果爲false,則執行跳至 構造之後的第一個表達式。

我也許應該給一個ECMAScript引用的鏈接,但我很確定它說明或多或少相同的東西。

+4

好運。我剛剛瀏覽了[for ECMA-262規格](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)for`for`循環,它們通常是不可思議的。上述行爲是遵循規範中的步驟的結果,而不是被明確規定。 – Phrogz 2011-01-19 21:38:26

1

一個空的中間部分應該被解釋爲true,所以它不是虛假的。它在C語言和其他語言中具有相同的語義(如C#,Java等)。這將是一個真正的陷阱,已經改變它的JavaScript。

4

ECMAScript language specification

IterationStatement:對於(ExpressionNoIn_opt; Expression_opt; Expression_opt)聲明

如果第一表達式存在,則

  1. 令testExprRef是評估第一結果表達。
  2. 如果GetValue(testExprRef)爲false,則返回(normal,V,empty)。

由於第一個表達式(for的第二個參數)不存在,因此此部分從不運行,因此for循環不會退出。

1

有評價algorothm在標準ECMA-262腳本循環,說只有兩種情況下,循環將結束:

  1. break語句
  2. 中聲明的價值等於,但只有當這個陳述存在,所以它不必被評估爲true(可能在Mozilla js引擎它是)。