Expression Closures as Compliment to Arrow Functions
brendan at mozilla.org
Tue Mar 24 13:26:28 UTC 2015
> Jacob Parker schrieb:
>> Either I'm wrong, or that's missing some parens. Assume the following
>> only interpretation I can see to not throw a syntax error),
>> var y = (function (a) a ? f : x++)(1);
>> In which case, that could only return `f`, which when printed should
>> the source of f, no?
> Uh, I had some problems with that either, but finally got it now. If
> we make the parens explicit, the point is that the expression should
> be evaluated as
> var y = ((function (a) a) ? f : x++)(1); // === f(1)
> instead of
> var y = (function (a) (a ? f : x++))(1); // === f
> Admittedly, I think arrow functions have same problem. How is
> var y = (a) => a ? f : x++ (1);
> evaluated (or is it syntactically valid at all)?
The problem with expression closures is precedence inversion: you have
LowPrec ~~> HighPrec ~~> stuff ending with LowPrec. The particular
nonterminals are AssignmentExpression and PrimaryExpression.
No such problem afflicts arrows, because they are low-precedence, in
fact AssignmentExpression alternative right-hand sides. So your example
here is a syntax error, because you are placing two assignment
expressions next to one another with no operator or semicolon in between.
More information about the es-discuss