2011-01-19 7 views
10

Я изучал Google Closure Compiler, и одна вещь, которую я заметил, это то, что он преобразует while(true) в for(;;).Пустой для петли - for (;;)

Оба действительно поддерживают браузер, но почему пустая петля for не выходит из себя сразу? Вторая его часть пуста и, следовательно, ложна. Не правда ли, что когда вторая часть ложна, цикл for останавливается и выполнение продолжается с кодом, который приходит после цикла for?

Может ли кто-нибудь дать объяснение этому?

+2

Может быть, это быстрее ... кто-то должен сравнить их :) –

+2

Ну, это меньше, - это то, что делает компилятор: просто Минимизация ваш код (это отличный инструмент очень) – pimvdb

ответ

20

Нет, это неправда.

См: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for

состояние

Выражение быть оценены перед каждой итерации цикла. Если выражение принимает значение true, выполняется оператор . Этот условный тест является необязательным. Если опущено, условие всегда оценивает true. Если выражение оценивает значение false, выполнение пропускает до первое выражение, следующее за конструкцией .

Возможно, я должен указать ссылку на ссылку ECMAScript, но я уверен, что она содержит более или менее то же самое.

+4

удачи. Я просто просмотрел [спецификации ECMA-262] (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) для циклов 'for', и они, как правило, непостижимы. Вышеизложенное поведение является следствием следующих шагов в спецификации, а не в явной необходимости. – Phrogz

+0

Ну ладно ... Тогда я полагаю, что ссылка Mozilla и мое слово о том, что все популярные варианты ECMAScript ведут себя так, должно быть достаточно. : D – Mchl

1

Пустую среднюю часть следует интерпретировать как true, так что это не фальшь. Он имеет ту же семантику на C и других языках с таким циклом (например, C#, Java и т. Д.). Это была бы настоящая ловушка, которая изменила бы ее для JavaScript.

+1

Я этого не знал. Также я не хочу, чтобы это изменилось, мне просто интересно. – pimvdb

+0

@pimvdb: Я тоже это понял :) Я просто хотел указать, что на самом деле это не было для создателя JavaScript. Ему просто нужно было делать то, что делали все остальные (или путать много людей). С другой стороны, я думаю, он все равно путал людей, но с другими частями языка: D – Jakob

4

Из ECMAScript language specification:

ИнструкциюИтерации: для (ExpressionNoIn_opt; Expression_opt; Expression_opt) Заявление

Если первое выражение присутствует, то

  1. Пусть testExprRef быть результатом оценки первой Expression.
  2. Если GetValue (testExprRef) является ложным, верните (нормальный, V, пустой).

Поскольку первого выражения (второго аргумента для) нет, этот раздел никогда не запускается, поэтому цикл for не выходит.

1

Существует оценку algorothm из цикла в стандартной ECMA-262 сценария, который говорит, что есть только две ситуаций, в которых цикл закончится:

  1. заявление перерыва
  2. значения среднего заявления равно ложный , , но только в том случае, если этот оператор присутствует, поэтому он не обязательно должен быть оценен как true (возможно, это мозаика js engine).