Great catch!

now https://bugs.ecmascript.org/show_bug.cgi?id=4419 

On Jul 8, 2015, at 12:25 PM, Kevin Gibbons wrote:

> In the final ECMAScript 2015 spec, each function for which ContainsExpression 
> of that function's [[FormalParameters]] internal slot is true has a scope 
> object for its parameters. Additionally, these functions have a separate 
> scope object under this one for each parameter that has an initializer. See 
> 14.1.18 for the production "FormalParameter : BindingElement". The last 
> sentence of this section states
> 
> The new Environment Record created in step 6 is only used if the 
> BindElement’s Initializer contains a direct eval.
> 
> This is shown to be incorrect (aside from the "BindElement" typo) with the 
> following program.
> 
> var x = "outer";
> function f({ [eval('var x="inner"; "a";')]: y } = null) {
>   console.log(x);
> }
> f({a: "z"});
> 
> Because the presence of an initializer causes a new scope to be created, in 
> which the entire BindingElement is evaluated, this should print "outer". 
> Therefore, the scope is used any time there is a direct eval in 
> BindingElement.
> 
> The intent, per the last sentence of 14.1.18 and bug 3383, is that direct 
> evals in the parameter list cannot introduce new variables in the function's 
> parameters scope mentioned earlier. However, non-strict direct evals can also 
> occur in computed property names in parameters which do not have initializers
> 
> var x = "outer";
> function f({ [eval("var x='inner'; 'a';")]: y }) {
>   console.log(x);
> }
> f({a: "z"});
> 
> Because the separate scope is not created if no initializer is present, this 
> should print "inner".
> 
> Introducing an initializer, even an initializer which is just a simple value, 
> causes a separate scope to be created. This is non-intuitive, and appears to 
> be unintentional.

An oversight, I forget about the possibility of computer property name 
expressions in a parameter position.

> 
> There are multiple ways that this behavior can be fixed
> 
> Create a new scope for each parameter, unconditionally
> 

Yes, this fix reflects what we intended.

> Define code in computed property names as strict code
> 
> The erroneous sentence at the end of section 14.1.18 may be fixed by 
> replacing it with "The new Environment Record created in step 6 is only used 
> if the BindElement contains a direct eval.".

and it should probably be tagged as a NOTE


_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to