我正在探索Google Closure Compiler,我注意到的一件事是它將while(true)
轉換爲for(;;)
。空循環 - for(;;)
兩者都會掛起瀏覽器,但爲什麼空的for
循環不會立即崩潰?它的第二部分是空的,因此是錯誤的。是不是真的,當第二部分是虛假的,for
循環停止並繼續執行for
循環後面的代碼?
有人可能會給這個解釋嗎?
我正在探索Google Closure Compiler,我注意到的一件事是它將while(true)
轉換爲for(;;)
。空循環 - for(;;)
兩者都會掛起瀏覽器,但爲什麼空的for
循環不會立即崩潰?它的第二部分是空的,因此是錯誤的。是不是真的,當第二部分是虛假的,for
循環停止並繼續執行for
循環後面的代碼?
有人可能會給這個解釋嗎?
不,這是不正確的。
參見:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for
條件
的表達式以每次循環迭代之前進行評估。如果此 表達式的計算結果爲真,則執行 語句。這個 條件測試是可選的。 如果省略了 ,條件總是 的計算結果爲真。如果表達式 的計算結果爲false,則執行跳至 構造之後的第一個表達式。
我也許應該給一個ECMAScript引用的鏈接,但我很確定它說明或多或少相同的東西。
好運。我剛剛瀏覽了[for ECMA-262規格](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)for`for`循環,它們通常是不可思議的。上述行爲是遵循規範中的步驟的結果,而不是被明確規定。 – Phrogz 2011-01-19 21:38:26
一個空的中間部分應該被解釋爲true
,所以它不是虛假的。它在C語言和其他語言中具有相同的語義(如C#,Java等)。這將是一個真正的陷阱,已經改變它的JavaScript。
從ECMAScript language specification:
IterationStatement:對於(ExpressionNoIn_opt; Expression_opt; Expression_opt)聲明
如果第一表達式存在,則
由於第一個表達式(for的第二個參數)不存在,因此此部分從不運行,因此for循環不會退出。
有評價algorothm在標準ECMA-262腳本循環,說只有兩種情況下,循環將結束:
也許它的速度更快......應該有人標杆他們:) – 2011-01-19 21:38:11
那麼,它的體積更小 - 這是編譯器做什麼:剛剛涅槃你的代碼(這是一個偉大的工具,真的) – pimvdb 2011-01-19 21:39:38