<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Given that `let x == 10` or `let x === 10` is illegal, it doesn’t seem too bad to allow `if (let x = f(y))`, LexicalDeclaration is visually distinct from EqualityExpression because of the `let` or `const` prefix.<div class=""><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 14, 2016, at 6:41 PM, Jordan Harband <<a href="mailto:ljharb@gmail.com" class="">ljharb@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">While I like the idea of making it simpler to restrict the scope of variables, currently a reigning best practice is to never do assignment in conditionals, since it can be an easy typo from `==` or `===`, and because it conflates assignment with expression truthiness, harming readability.<br class=""><div class=""><br class=""></div><div class="">This seems like it runs afoul of the latter, certainly, and I haven't yet convinced myself whether it creates typo hazards (I'm thinking no, but wanted to bring it up just in case).</div></div></div></blockquote><div><br class=""></div>Given that `let x == 10` or `let x === 10` is illegal, it doesn’t seem too bad to allow `if (let x = f(y))`, LexicalDeclaration is visually distinct from EqualityExpression because of the `let` or `const` prefix.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, Sep 14, 2016 at 3:14 AM, Danielle McLean <span dir="ltr" class=""><<a href="mailto:gopsychonauts@gmail.com" target="_blank" class="">gopsychonauts@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 14 September 2016 at 17:58:24, Viktor Kronvall<br class="">
<span class="">(<a href="mailto:viktor.kronvall@gmail.com" class="">viktor.kronvall@gmail.com</a>(<wbr class="">mailto:<a href="mailto:viktor.kronvall@gmail.com" class="">viktor.kronvall@gmail.<wbr class="">com</a>)) wrote:<br class="">
<br class="">
> Does this really need new semantic interpretation of the syntax? Using the `Array.prototype` methods `.forEach` and `.map` already mitigates this problem as far as I can tell by having a different bound variable (argument in this case) for each call.<br class="">
><br class="">
> I agree that the behavior may be non-intuitive if you have a background coming from Java or C++ but the implications would be quite far-reaching and the backward compatibility with previous versions would be difficult to handle. Wouldn't this require a new 'use strict'-like mode?<br class="">
<br class="">
</span>No, adding anaphoric if as I have described it will require neither<br class="">
new semantic interpretation of the syntax nor a new strictness<br class="">
directive. Currently, it is a syntax error to write a variable<br class="">
declaration within an `if` or `while` condition, so there is no valid<br class="">
code which contains the proposed syntax.<br class="">
<br class="">
Also note that under this proposal, declarations made using the `var`<br class="">
keyword would still be hoisted to function scope, *not* scoped to the<br class="">
body associated with the condition - i.e., there would be no semantic<br class="">
difference whatsoever between the following two snippets:<br class="">
<br class="">
    if (var stuff = some.cool(expression)) doThings(stuff);<br class="">
    // equivalent to<br class="">
    var stuff;<br class="">
    if (stuff = some.cool(expression)) doThings(stuff);<br class="">
<br class="">
Only declarations made with the newer `let` and `const` keywords,<br class="">
which are never hoisted to function scope anyway, would be narrowly<br class="">
scoped to the condition and its body.<br class="">
<br class="">
    if (let stuff = expr) doThings(stuff);<br class="">
    // equivalent to<br class="">
    {<br class="">
      let stuff = expr;<br class="">
      if (stuff) doThings(stuff);<br class="">
    }<br class="">
<br class="">
(An aside: as the last example demonstrates, the `if` or `while`<br class="">
statement body should not need braces to isolate the scope in this<br class="">
way. This is consistent with the current behaviour for declarations in<br class="">
loops.)<br class="">
<div class="HOEnZb"><div class="h5">______________________________<wbr class="">_________________<br class="">
es-discuss mailing list<br class="">
<a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class="">
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank" class="">https://mail.mozilla.org/<wbr class="">listinfo/es-discuss</a><br class="">
</div></div></blockquote></div><br class=""></div>
_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class="">https://mail.mozilla.org/listinfo/es-discuss<br class=""></div></blockquote></div><br class=""></div></div></body></html>