Во многих браузерах, которые я тестировал, блоки JavaScript фактически возвращают значение. Вы можете проверить это в любой консоли:
for(var i = 0; i < 10; i++) {
var sqrt = Math.sqrt(i);
if(Math.floor(sqrt) === sqrt) {
i;
}
}
«Возвращаемое» значение — это последнее квадратное число, то есть 9! Но поскольку это не выражение, я полагаю, вы не можете сделать это:
for(var i = 0; i < 10; i++) {
...
} + 5
Это не работает. Конечно, это дает + 5
или 5
, потому что это отдельный оператор. Помещение цикла в круглые скобки явно не работает, и если блок находится в круглых скобках (например, ({f(); r})
- не работает), он обрабатывается как объект и выдает синтаксическую ошибку.
Один из способов воспользоваться возвращаемым значением как таковым — использовать eval
:
eval('for(var i = 0; i < 10; i++) {var sqrt = Math.sqrt(i);if(Math.floor(sqrt) === sqrt) {i;}}') + 5; // 14
Но я, очевидно, не захочу использовать это, если eval
— единственное решение. Есть ли способ использовать результирующее значение блока без использования eval
, который мне не хватает? Мне очень нравится эта функция :)
eval
? - person Ry-♦   schedule 23.12.2011eval
как аномалию, а не ограничение, которое обычно накладывает JS (читай: игнорирование внеeval
). Блоки не являются выражениями. - person   schedule 23.12.2011eval( '{ 1; }' ) + 1
оценивается как2
, и вам нужна эта функциональность, потому что... - person Šime Vidas   schedule 23.12.2011i;
вместо того, что, как вы думаете, возвращает цикл for, предполагая, что на самом деле цикл for ничего не возвращает). - person slebetman   schedule 23.12.2011eval
, это работает. - person Ry-♦   schedule 23.12.2011i;
вместо того, что возвращает цикл for). - person slebetman   schedule 23.12.2011eval()
возвращает значение завершения программы JavaScript, которая была передана в качестве исходного текста. Это интересный момент. Кроме этого, я не знаю другого способа получить значение завершения программы/инструкции... - person Šime Vidas   schedule 23.12.2011