On a lot of browsers I've tested, JavaScript blocks actually return a value. You can test it out in any console:

```
for(var i = 0; i < 10; i++) {
var sqrt = Math.sqrt(i);
if(Math.floor(sqrt) === sqrt) {
i;
}
}
```

The "return" value is the last square number, that is, 9! But since it isn't an expression I suppose, you can't do this:

```
for(var i = 0; i < 10; i++) {
...
} + 5
```

That doesn't work. It gives `+ 5`

, or `5`

, of course, because it's a separate statement. Putting the loop in parentheses obviously fails, and if a block is in parentheses (e.g. `({f(); r})`

- doesn't work) it's treated as an object and throws a syntax error.

One way to take advantage of the return value, as such, is to use `eval`

:

```
eval('for(var i = 0; i < 10; i++) {var sqrt = Math.sqrt(i);if(Math.floor(sqrt) === sqrt) {i;}}') + 5; // 14
```

But I'm obviously not going to want to use that if `eval`

is the only solution. Is there a way to use a block's resultant value without using `eval`

that I'm missing? I really like this feature :)

In JavaScript, statements return values of the Completion type (which is not a language type, but a specification type).

The Completion type is used to explain the behaviour of statements (

`break`

,`continue`

,`return`

and`throw`

) that perform nonlocal transfers of control. Values of the Completion type are triples of the form (type,value,target), wheretypeis one ofnormal,break,continue,return, orthrow,valueis any ECMAScript language value orempty, andtargetis any ECMAScript identifier orempty.

Source: http://es5.github.com/x8.html#x8.9

So, `eval()`

evaluates the program that has been passed in as source text. That program (like any JavaScript program) returns a Completion value. The second item in this Completion value (the "value" item) is returned by the `eval()`

invocation.

So, with `eval`

you are able to retrieve the *completion value* of an JavaScript program. I am not aware of any other method to accomplish this...

There is a proposal for ES7 to introduce a do expression which allows any block to be turned into an expression. A do expression evaluates a block and returns its completion value.

Using this syntax, which you can try out today with Babel using the syntax-do-expression and transform-do-expression plugins, your example would look like this:

```
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));
```

©2020 All rights reserved.