Использование значения возврата блока в 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
, которое мне не хватает? Мне очень нравится эта функция:)
Ответы
Ответ 1
В JavaScript операторы возвращают значения типа Completion (который не является типом языка, а специфицированным типом).
Тип завершения используется для объяснения поведения операторов (break
, continue
, return
и throw
), которые выполняют нелокальные передачи контроль. Значения типа "Завершение" - это тройки формы (тип, значение, цель), где тип - один из нормальный, break, continue, return, или throw, значение - любое значение языка ECMAScript или пустое, а целевое это любой идентификатор ECMAScript или пустой.
Источник: http://es5.github.com/x8.html#x8.9
Итак, eval()
оценивает программу, которая была передана в качестве исходного текста. Эта программа (например, любая программа JavaScript) возвращает значение Completion. Второй элемент в этом значении Completion (элемент "value" ) возвращается вызовом eval()
.
Итак, с eval
вы можете получить значение завершения программы JavaScript. Я не знаю другого метода для этого...
Ответ 2
В ES7 есть предложение ввести выражение do, которое позволяет любому блоку превращаться в выражение. Выражение do вычисляет блок и возвращает его значение завершения.
Используя этот синтаксис, который вы можете попробовать сегодня с Babel, используя syntax-do-expression и transform-do-expression, ваш пример будет выглядеть так:
function lastSquareNumber(val) {
return do { for(var i = 0; i < val; i++) {
var sqrt = Math.sqrt(i);
if(Math.floor(sqrt) === sqrt) {
i;
}
}}
}
console.log(lastSquareNumber(10));