Объявление переменной в состоянии while в javascript
В сущности, я пытаюсь объявить переменную в условии-часть цикла while в javascript:
while (var b=a.pop()) {
do_sth(b)
}
Тем не менее, мой браузер (firefox) не принимает этого. Вместо этого мне нужно идти так:
var b
while (b=a.pop()) {
do_sth(b)
}
который работает. Ожидается ли такое поведение?
Ответы
Ответ 1
JavaScript не имеет области блока. Он имеет функцию. Поэтому, чтобы убедиться, что люди и JavaScript оба читают код одинаково, вы должны вручную поднять объявления var вплоть до верха функций.
Здесь JSLint говорит о вашем коде:
Problem at line 1 character 8: Expected an identifier and instead saw 'var'.
Используйте JSLint, по крайней мере, пока вы изучаете JavaScript. Вы узнаете много очень быстро. Это повредит вашим чувствам.
Ответ 2
Да, это так.
Если вы хотите, вы можете использовать цикл for
, например:
for (var b; b = a.pop(); ) { //Note the final semicolon
do_sth(b);
}
Ответ 3
Вопрос немного устарел, но я думаю, что все ответы не имеют важного отличия. То есть, цикл while
ожидает выражения, которые ожидают условного, то есть логического или значения, которое может быть преобразовано в логическое. Подробнее см. Документы Mozilla.
Чистое присваивание (без создания экземпляра) принудительно приводит к логическому значению через возвращаемое по умолчанию значение (значение правой стороны).
A var
(или let
или const
) - это оператор, который допускает необязательное назначение, но имеет возвращаемое значение undefined
.
Вы можете легко протестировать это в своей консоли:
var foo = 42; // undefined
bar = 42 // 42
Только возвращаемые значения не отвечают на вопрос, так как undefined
является ложным, но показывает, что даже если JS позволяет помещать var
в условное выражение, оно просто всегда будет оцениваться как false.
Другие упомянули операторы for
и что они позволяют объявлять и создавать экземпляры переменных. Это верно, но документация
Ответ 4
JavaScript не имеет области блока. Таким образом, объявления var
находятся в области функций. Поэтому объявление переменной в выражении while
не имеет смысла в JavaScript.
Кроме того, вы должны заканчивать свои высказывания точкой с запятой. Это не строго необходимо, но настоятельно рекомендуется.