Подтвердить что ты не робот

Использование значения возврата блока в 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, которое мне не хватает? Мне очень нравится эта функция:)

4b9b3361

Ответ 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));