On Tue, Sep 11, 2012 at 11:37 AM, Dmitry Soshnikov <span dir="ltr"><<a href="mailto:dmitry.soshnikov@gmail.com" target="_blank">dmitry.soshnikov@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>On Tue, Sep 11, 2012 at 1:33 AM, Brendan Eich <span dir="ltr"><<a href="mailto:brendan@mozilla.com" target="_blank">brendan@mozilla.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<br>
If you really want the Pythonic default parameter rules (evaluation in definition context) then you need to address the bad case Jason showed:<br>
<br>
  function foo(arg = []) {<br>
    arg.push('strange');<br>
    return arg;<br>
  }<br>
  foo(); // ['strange']<br>
  foo(); // ['strange', 'strange']<br>
<br>
This is a side channel and a big footgun. ES6 default parameters as proposed avoid it.<span><font color="#888888"><br>
<br>
</font></span></blockquote></div><br></div>Sure, and as I mentioned in my first message -- ES may eval defaults every time at activation, not only once as Python does. But -- still in the outer scope (in the foo.[[Scope]] in your example).<br>


<br>function foo(arg = <expression>) { ... }<br><br>evaluates the <expression> every time at activation as:<br><br>1. If expression is a literal value, create a *new* value corresponding to literal. Assign to the parameter. Return.<br>

</blockquote><div><br><br>OK, now I see that this defers to the activation time *only*, which probably doesn't make much sense in evaluation in only parent scope. Sorry for confusion, yes, in this case evaluation including activation frame fits better.<br>
<br>And I also see now Allen's example with generators, which, if to accept desugaring you noted (with if (== void 0) then assign) may be an issue if creation of the generator should not trigger the activation until the "next" call.<br>
<br>Dmitry<br></div></div>