Andreas Rossberg (2013-12-20T13:32:40.000Z)
On 20 December 2013 04:05, Brendan Eich <brendan at mozilla.com> wrote:
> Andrea Giammarchi wrote:
>>
>> why is this not possible, giving the ability to understand through typeof
>> if there is a value or not?
>>
>> ```javascript
>> // defined as const
>> // reserved in this scope
>> // but not assigned yet
>> const WHATEVER;
>> if (condition) {
>>   // first come, first serves
>>   WHATEVER = 123;
>>   // that's it! const defined for the whole scope
>>   // immutable from now on
>> } else {
>>   WHATEVER = 456;
>> }
>
>
> Past JS2/ES4 designs have allowed this, but it requires definite assignment
> analysis and use-before-defining-assignment error checking.
>
> In general, such checks can't be static in JS, so the language and VM
> complexity blow up a bit with runtime checking for an "uninitialized" (not
> same as undefined) sentinel value that must be guarded against by a read
> barrier where it can't be proven unnecessary.
>
> This is pretty obnoxious for implementors, not great for users either (did I
> declare const IMPORTANT; and forget to assign IMPORTANT= in some branch of
> control flow that my tests miss?).
>
> It's not in Harmony. We require an initialiser as part of the const
> declaration syntax. What you are doing here, by many measures, is varying a
> variable from its default (undefined) value to a new value.
>
> If you want that variable to stop varying after, and you need it as a global
> (window) object property anyway, use Object.defineProperty to make it
> non-writable.
>
> BTW, the last version your head post gave,
>
> const ES6_PROXY = function(){
>
>   try {
>     new Proxy({},{});
>     return true;
>   } catch(o_O) {
>     return false;
>   }
> }();

Of course, the problem here is hardly specific to feature detection,
or const, but simply an instance of the general annoyance induced by
the old-school statement/expression separation. What you'd really want
to write is something like

  const ES6_PROXY = try new Proxy({}, {}), true catch (_) false;

For ES7 I would like to revive the do-expression proposal (hopefully
at the next meeting), so that one can at least approximate the above
with

  const ES6_PROXY = do { try { new Proxy({}, {}); true } catch (_) { false } };

Of course, semantically the function is equivalent, and a fine
solution, if a bit verbose.

/Andreas
domenic at domenicdenicola.com (2014-01-06T13:49:17.430Z)
On 20 December 2013 04:05, Brendan Eich <brendan at mozilla.com> wrote:
> BTW, the last version your head post gave,
>
> ```js
> const ES6_PROXY = function(){
>
>   try {
>     new Proxy({},{});
>     return true;
>   } catch(o_O) {
>     return false;
>   }
> }();
> ```

Of course, the problem here is hardly specific to feature detection,
or const, but simply an instance of the general annoyance induced by
the old-school statement/expression separation. What you'd really want
to write is something like

```js
const ES6_PROXY = try new Proxy({}, {}), true catch (_) false;
```

For ES7 I would like to revive the do-expression proposal (hopefully
at the next meeting), so that one can at least approximate the above
with

```js
const ES6_PROXY = do { try { new Proxy({}, {}); true } catch (_) { false } };
```

Of course, semantically the function is equivalent, and a fine
solution, if a bit verbose.