<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jan 30, 2014 at 10:59 AM, John Barton <span dir="ltr"><<a href="mailto:johnjbarton@google.com" target="_blank">johnjbarton@google.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div class="im">On Thu, Jan 30, 2014 at 7:54 AM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com" target="_blank">brendan@mozilla.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>John Lenz wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Generally, I've always thought of:<br>
<br>
"if (x) ..." as equivalent to "if (x) { ... }"<br>
</blockquote>
<br></div>
let and const (and class) are block-scoped. {...} in your "if (x) {...}" is a block. An unbraced consequent is not a block, and you can't have a "conditional let binding".<br>
<br>
The restriction avoids nonsense such as<br>
<br>
let x = 0; { if (y) let x = 42; alert(x); }<br>
<br>
What pray tell is going on here, in your model?</blockquote><div><br></div></div><div>I'm with John: the alert should say 0 and I can't see why that is not obvious.</div></div></div></div></blockquote><div><br><br>

</div><div>It's not obvious at all -- what happens when you drop the initial `let x = 0;` and you just have `{ if (y) let x = 42; alert(x); }` -- now what happens? Is x declared or not?<br><br>To my mind `if (y) let x = 42;` reads like it's own 1-line noop block -- at least, that's what I'd expect of the scope. So while it could be allowed in that sense, it'd only serve as a footgun when y is true.<br>

</div></div></div></div>