Your C comparison was apples-to-oranges, #ifdef is evaluated at compile time.
On Fri, Dec 20, 2013 at 8:32 AM, Andreas Rossberg <rossb...@google.com>wrote: > On 20 December 2013 04:05, Brendan Eich <bren...@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 > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss