On Nov 13, 2013, at 4:18 PM, Ian Halliday wrote:
> Oh, is “shadowing” a let declaration with a var declaration a syntax error?
> E.g.
yes, although strictly speaking it is the hoisting of the var over the let that
is an error. Amounts to the same thing.
>
> {
> let x;
> {
> var x;
> }
> }
>
> From: es-discuss [mailto:[email protected]] On Behalf Of Ian
> Halliday
> Sent: Wednesday, November 13, 2013 4:14 PM
> To: Allen Wirfs-Brock
> Cc: [email protected]
> Subject: RE: Specification of use before declaration errors
>
> Then for 13.1.8 shouldn’t there be something like this
>
> StatementListItem : Statement
> 1. If Statement is a Block then return a new empty List.
> 2. Else return VarDeclaredNames of Statement
>
> defined in order to prevent the var names from spreading into enclosing
> blocks?
>
> I might be misunderstanding VarDeclaredNames. I am guessing that it should
> be a collection of all the names declared via var declaration statements,
> i.e. VariableStatement, but there isn’t a definition of VarDeclaredNames for
> VariableStatement.
> 13.1.8 Static Semantics: VarDeclaredNames
>
> See also: 13.0.1, 13.5.1, 13.6.1.1, 13.6.2.1, 13.6.3.1, 13.6.4.3, 13.10.2,
> 13.11.4, 13.12.2, 13.14.2, 14.1.11, 14.4.10, 14.5.14, 15.1.0.12, 15.2.5.
>
> Block : { }
> 1. Return a new empty List.
> StatementList : StatementList StatementListItem
> 1. Let names be VarDeclaredNames of StatementList.
> 2. Append to names the elements of the VarDeclaredNames of
> StatementListItem.
> 3. Return names.
> StatementListItem : Declaration
> 1. Return a new empty List.
>
>
>
> From: Allen Wirfs-Brock [mailto:[email protected]]
> Sent: Wednesday, November 13, 2013 3:49 PM
> To: Ian Halliday
> Cc: [email protected]
> Subject: Re: Specification of use before declaration errors
>
>
> On Nov 13, 2013, at 3:41 PM, Ian Halliday wrote:
>
>
> Wait, so is there no variable shadowing allowed then?
>
> this is saying that things like the following are illegal:
>
> {var x;
> let x;
> }
>
> But shadowing, like the following is fine:
>
> var x;
> {let x;
> }
>
>
>
>
>
> 13.1.1 Static Semantics: Early Errors
>
> Block : { StatementList }
> · It is a Syntax Error if the LexicallyDeclaredNames of StatementList
> contains any duplicate entries.
>
> · It is a Syntax Error if any element of the LexicallyDeclaredNames
> of StatementList also occurs in the VarDeclaredNames ofStatementList.
>
> StatementList can contain Blocks whose LexicallyDeclaredNames and
> VarDeclaredNames algorithms return the values for their StatementLists, so it
> recursively collects the names from all nested lexical and var declarations.
>
> It looks like VarDeclaredNames is missing a definition for VariableStatement
> because I can’t see any way for the bound names of a VariableStatement to get
> added to VarDeclaredNames lists.
>
> But barring for the moment that I cannot find an algorithm definition that
> adds BoundNames of a VariableStatement to VarDeclaredNames, this second early
> error bullet implies that shadowing of bound names is not allowed at all.
>
> Is this correct?
>
> Ian
>
>
> From: Allen Wirfs-Brock [mailto:[email protected]]
> Sent: Friday, November 8, 2013 4:16 PM
> To: Ian Halliday
> Cc: [email protected]
> Subject: Re: Specification of use before declaration errors
>
>
> On Nov 8, 2013, at 3:35 PM, Ian Halliday wrote:
>
>
>
> Hello es-discuss,
>
> I’m having difficulty figuring out where the ES6 draft spec specifies that a
> “use before declaration” error should be thrown. My last understanding of
> the temporal dead zone was that ECMAScript would always issue a “use before
> declaration” error at runtime, regardless whether it can be statically
> determined or not. However it seems like the evaluation semantics of var
> declarations, for example, do not lead to any line that throws a
> ReferenceError.
>
>
>
> That is, consider this code:
>
> function f() {
> {
> var x = 5;
> let x;
> declaring the same name using a let and a var is an early error:
> http://people.mozilla.org/~jorendorff/es6-draft.html#sec-block-static-semantics-early-errors
>
> or for the function level
> http://people.mozilla.org/~jorendorff/es6-draft.html#sec-function-definitions-static-semantics-early-errors
>
>
>
>
>
> }
> }
>
> f();
>
> I think the var declaration creates a binding for x in the function’s lexical
> environment, but then binds to the x in the block’s environment for the
> initialization. As such, the initialization should throw a “use before
> declaration” error. But this is what I cannot find in the spec. Maybe I am
> wrong about the semantics here?
>
> because an early error exists, the surround script or module is never
> evaluated.
>
> Allen
>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss