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