Во многих браузерах, которые я тестировал, блоки JavaScript фактически возвращают значение. Вы можете проверить его на любой консоли:Использование возвращаемого значения блока в JavaScript
for(var i = 0; i < 10; i++) {
var sqrt = Math.sqrt(i);
if(Math.floor(sqrt) === sqrt) {
i;
}
}
Значение «return» - это последнее квадратное число, то есть 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
, что мне не хватает? Мне очень нравится эта функция :)
Блоки заявления, а не выражения. Поэтому вы не можете использовать их в качестве операндов (вы не можете использовать на них операторы) ... –
@ ŠimeVidas: Точно - есть способ как-то заставить их работать? Не использовать 'eval'? – Ryan
Вы должны рассматривать возвращаемое значение eval как аномалию, а не ограничение, которое JS «обычно» (чтение: игнорирование вне 'eval') накладывается. Блоки ** не ** выражения. – delnan