On Oct 1, 2013, at 12:03 AM, André Bargull wrote:
>> > Brandon Benvie <mailto:bbenvie at mozilla.com>
>> > September 30, 2013 8:48 PM
>> > I'm actually now really curious what the following does:
>> >
>> > ```
>> > function foo(x, y = (() => { arguments[0] = "foo"; return "bar" })()) {
>> > return [x, y];
>> > }
>>
>> Easy: arguments is an early error in the body of an arrow.
>>
>> http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax
>>
>> /be
>
> This restriction is not specified in the rev19 draft. Currently arrow
> functions don't have an own `arguments` binding, but instead access the outer
> functions `arguments` object, similar to `this`. Disallowing the identifier
> "arguments" in PrimaryExpressions also should imply disallowing "arguments"
> as a BindingIdentifier, which shifts arrow functions again into "almost
> strict-mode".
>
> - André
The restriction we want and how to enforce it is not all that clear.
We don't really want to have an "almost strict" mode for the body of arrow
functions, if that was going to be the case I think it would be much better to
simply say that arrow functions are always strict.
The spec. currently applies the static semantics of strict mode formal
parameters (no duplicate names, can't name a parameter 'eval' or 'arguments')
to arrow function formal parameters, but in all other ways both the formal
parameter list (think default value expressions) and the arrow function body
follow the strictness of the surrounding code.
that means things like the following are valid in non-strict arrow functions:
() => {function arguments() {}; return arguments}
() => {let arguments =5; ...}
So we can't just statically disallow 'arguments' references in a ConciseBodu
Also, we have to have consistent behavior for an
eval('arguments')
that appears in a ConciseBody.
Here are possible reasonable alternatives for handling arguments in arrow
functions:
1) nothing special, same rules as a FunctionExpression. An arguments object is
available and strict/non-strict distinctions apply both statically and
dynamically.
2) nothing special, but strict arguments object. Just like #1 except it always
has a strict mode arguments object (no joining of augments elements and formal
parameters
3) #2, plus strict mode parameter naming restrictions are also applied (no
duplicates, can't use 'eval' or 'arguments' as parameter names)
4) no-arguments objects with shadowing, 'arguments' binds to undefined. Arrow
functions do not have an arguments objects but they have an implicit constant
binding of 'arguments' in their parameter scope whose value is undefined.
References to 'arguments' in the body evaluate to undefined. (unless,
non-strict and there are explicit declarations of the name 'arguments');
5) no-arguments objects with shadowing, 'arguments' is in temporal dead zone.
Arrow functions do not have an arguments objects but they have an implicit
binding of 'arguments' in their parameter scope that is never marked as
initialized. References to 'arguments' in the body throw because they are
temporal dead zone references. (unless, non-strict and there are explicit
declarations of the name 'arguments' that shadow the parameter level binding);
6) nothing special, but no arguments object, normal lexical scoping. Like #1
except that there is no arguments object or local binding of 'arguments'.
References to arguments resolve via the enclosing scope.
7) strict mode name restrictions, but no arguments object, normal lexical
scoping. Like #3 except that there is no arguments object or local binding of
'arguments'. References to arguments resolve via the enclosing scope.
The rev19 spec. current has approximately #7 but there isn't anything final
about that. It sounds to me like some think either #3 or #4 is the plan of
record although I don't think we've talked about it at a TC39 meeting that this
level of detail.
I think #3 would be a good solution. So is #7.
#3 probably would seem reasonable to JS programmers. #7 probably is what
lexical scoping heads would expect. #4 or #5 is a completely new semantics that
I don't think anyone expects.
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss