<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">You misunderstand.  The two scope design is all about preventing closures from referencing variables declared within the body of the functions.  See <a href="https://github.com/tc39/tc39-notes/blob/master/es6/2013-09/default-arguments.pdf" class="">https://github.com/tc39/tc39-notes/blob/master/es6/2013-09/default-arguments.pdf</a> for the motivation for this design. (but be aware that there are probably some subtle differences between the final specified design and what this deck describes.<div class=""><br class=""></div><div class="">In you to test cases, `arg` is not declared within the body of `fn` so there is no duplicate binding for it.  Things would be different if you had a `var` or `function` declaration for `arg` within the body.</div><div class=""><br class=""></div><div class="">Allen<br class=""><div class=""><br class=""></div><div class=""><div class=""><blockquote type="cite" class=""><div class="">On May 9, 2017, at 12:40 PM, Logan Smyth <<a href="mailto:loganfsmyth@gmail.com" class="">loganfsmyth@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hey all,
<div class="">We're currently exploring some changes to Babel's behavior for function parameter default scoping, and I was hoping to validate my understanding of the spec, because my reading of the spec does not conform to Chrome or FF's behavior. Alternatively if you know bugs for those engines for this, let me know.</div><div class=""><br class=""></div><div class="">My understanding from <a href="https://tc39.github.io/ecma262/#sec-functiondeclarationinstantiation" class="">https://tc39.github.io/ecma262/#sec-functiondeclarationinstantiation</a> step #27 is that if function parameters contain any expressions, the function body is shifted to run in a declarative environment separately from the params. Per #27.f.i.4.a, the initial values of the params are copied from from the param environment into the function body environment, at initial execution time.</div><div class=""><br class=""></div><div class="">Given that, I'd expect cases such as<br class="">```<br class=""><div class="">(function fn(arg, setValue = function () { arg = "a string" }) {</div><div class="">  setValue();</div><div class=""><br class=""></div><div class="">  return arg;</div><div class="">})("initial")<br class="">```</div></div><div class="">to return `initial`, because the `arg` binding being mutated by `setValue` is not tied to the `arg` binding that the function returns, as the `"initial"` value would have been copied into the function body binding before `setValue` ran.</div><div class=""><br class=""></div><div class="">Is my understanding there correct?<br class=""><br class="">Similarly I'd have expected<br class="">```<br class=""><div class="">(function fn(arg, getValue = function () { return arg; }) {</div><div class=""><br class=""></div><div class="">  arg = "new value";</div><div class=""><br class=""></div><div class="">  return getValue();</div><div class="">})("initial")<br class="">```</div></div><div class=""><br class=""></div><div class="">to return `"initial"` because it is returning the binding value from the declarative environment in the function params and accessed by `getValue` is not the same environment being mutated by the assignment to `arg1`.</div><div class=""><br class=""></div><div class="">Is my understanding correct, or is there something I'm misunderstanding?</div><div class=""><br class=""></div><div class="">Thanks!</div></div>
_______________________________________________<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" class="">https://mail.mozilla.org/listinfo/es-discuss</a><br class=""></div></blockquote></div><br class=""></div></div></body></html>