With the help of your explanation, the spec becomes much easier to read. Thanks.
Would you consider adding this: Syntax export default var VariableDeclaration; ExportEntries Let entries be a new empty List. Let name be the BoundNames of VariableDeclaration. Repeat for each name in names, Append to entries the Record {[[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]:name, [[ExportName]]: “default" }. Return entries. Vice versa for LexicalDeclaration. > On Dec 16, 2014, at 3:20 PM, Allen Wirfs-Brock <al...@wirfs-brock.com> wrote: > > > On Dec 15, 2014, at 10:06 PM, Brendan Eich wrote: > >> Ah, thanks -- I remember someone pointing this out, now that you mention it. >> >> My misunderstanding in the last two posts dings my ES6 quiz score! Who will >> get a perfect score in a fresh (uncoached) quiz setting? Is this telling us >> something? Anyway, I agree that `export default function a() {}` making an >> `a` binding is better, it resolves the confusing aspect in my misunderstood >> version of ES6 that Glen cited in his 7pm post. >> >> One more question below: >> >> Allen Wirfs-Brock wrote: >>>> This seems clear. As Dave said, he originally proposed an '=' in between >>>> 'default' and the *expression* to evaluate on the right. That design >>>> remembrance should make clear that the default export is a function >>>> expression (not function declaration) with 'a' the name only in the scope >>>> of that function (either for recursion or as a downward funarg). >>>> >>>> The 'default' binding won't be mutated via the final 'a = 2' statement, so >>>> the default-exported value is still the result of evaluating the function >>>> a(){} expression. >>> >>> Not quite how it actually ended up. See >>> https://bugs.ecmascript.org/show_bug.cgi?id=2302 >>> <https://bugs.ecmascript.org/show_bug.cgi?id=2302> for background. >>> >>> export default function ... >>> export default function * ... >>> export default class ... >>> >>> all act as declaration that create a module local binding (for the name in >>> the declaration part) that is initialized in the normal manner (hoisted >>> for function/function*, statement order initialization for class). In >>> addition that binding is exported using the reserved export name 'default'. >>> Just like, an export of the same declaration without 'default', except such >>> declaration use the same name for both the export name and the local >>> binding name. >> >> So assigning `a = 2` won't affect the value of the default export, but will >> rebind `a`, given preceding `export default function a() {}` -- right? > > It does both. 'a' is rebound to 2 and since the export name 'default' > associates to 'a', any subsequent references in other modules tht are linked > to the default export of this module will also see 2 because 'default' is > really just the export name for 'a'. > >> >>> For export default, if the declaration is anonymous (this required some >>> minor syntax tweaking) , a local binding is still created (and initialized >>> in the manner manner) but the local binding isn't locally referencable >>> because it doesn't have a name that can be referenced via an >>> IdentifierReference. >> >> Hmm, how's that work? Throwaway symbol name? > Well ultimately it's all linkages that at the implementation level hopefully > resolve external (ie imported) references into direct references to exported > variable binding. > > At the spec. level, I just define a non-identifer name ("*default*") to the > binding created by a anonymous 'export default'. There can only be one per > modules. It turns out all the declaration instantiation, binding lookup, and > module linking mechanism in the spec. work fine with such a name, so there is > actually very few special cases in the spec. for such anonymous default > exports. See > https://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-exports-static-semantics-exportentries > > <https://people.mozilla.org/~jorendorff/es6-draft.html#sec-exports-static-semantics-exportentries> > for how exports associate an export name with either a local binding name or > an import name from some other module. > >> >> I ask because Glen also wondered about the Module Record being reified in >> one of his posts. That's spec-internal, though (again, correction welcome). > > Right, Module Record is just internal spec. mechanism used to define the > module semantics. It currently isn't reified. > > Allen > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss