On Thu, Dec 19, 2013 at 3:03 PM, Andrea Giammarchi <
andrea.giammar...@gmail.com> wrote:

> It seems that I need to create N amount of garbage by design.
>
> This does not work, the const has already been defined:
>
> ```javascript
> try {
>   new Proxy({},{});
>   const ES6_PROXY = true;
> } catch(o_O) {
>   const ES6_PROXY = false;
> }
> ```
>

That doesn't work anyway, not because the const has already been defined,
but because ES6_PROXY is defined within block bodies. Same as:

{
  const IS_BOUND_TO_THE_BLOCK = true;
}



>
> This does not work neither
>
> ```javascript
> try {
>   new Proxy({},{});
>   var ES6_PROXY = true;
> } catch(o_O) {
>   var ES6_PROXY = false;
> }
> const ES6_PROXY = false;
>
> // var 'ES6_PROXY' has already been declared
> ```
>

Because the var was hoisted up to the const's scope and const can't be used
to redeclare an existing binding of the same name. Is ES6_PROXY meant to be
bound in the global scope?



>
> neither does the following
>
> ```javascript
> try {
>   new Proxy({},{});
>   let ES6_PROXY = true;
> } catch(o_O) {
>   let ES6_PROXY = false;
> }
>
> // Illegal let declaration outside extended mode
>

That's a Canary-specific error, but the code wouldn't do what you want
anyway, for the same reason as the first example.


> ```
>
> As summary, there is no way to feature detect and define a const in the
> same scope, a closure without the possibility to define such constant as
> well is mandatory.
>
> ```javascript
> const ES6_PROXY = function(){
>   try {
>     new Proxy({},{});
>     return true;
>   } catch(o_O) {
>     return false;
>   }
> }();
> ```
>

This works fine:

  var result = true;
  try {
    new Proxy({},{});
  } catch(o_O) {
    result = false;
  }
  const ES6_PROXY = result;




Rick
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to