Re: Reconciling handling of optional arguments and handling of default values across ES and webidl

On Jun 18, 2013, at 8:18 AM, Boris Zbarsky wrote:

> On 6/18/13 11:00 AM, Allen Wirfs-Brock wrote:
>> Cameron, Either I'm misinterpreting what you are trying to say or you misunderstand what Boris said.  ES6 does allow a parameter with an explicit default value to be followed by one without an explicit default value.
> 
> I think part of the issue here is that the state of "ES6" is unclear to at least me. http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values says:

The specification drafts is what you need to be reading as old wiki proposals are seldom updated.  Only refer to the wiki for proposals (such as modules) that have not yet made it into the draft. 

> 
>    Added restriction not expressed by this grammar: only trailing
>    formal parameters may have default values specified by =
>    AssignmentExpression

That text dates to 2009.  The current specification is based upon  subsequent es-disuss and TC39 discussions. 

> 
> and that matches what SpiderMonkey, at least, implements:

implementors really need to read the spec. and not just wiki pages

> 
>  js> function f(a = 5, b) {}
>  typein:1:18 SyntaxError: parameter(s) with default followed by
>  parameter without default:
>  typein:1:18 function f(a = 5, b) {}
>  typein:1:18 ..................^
> 
> and what SpiderMonkey developers I asked about the behavior told me the spec says.  On the other hand http://people.mozilla.org/~jorendorff/es6-draft.html has quite different language which matches what you're quoting.  Has the spec just changed recently?

No, the line I quoted was added to the spec. in May 2012 and it was just added for clarification (from a previous time this issue came up). It looks like it originally made it into the spec. in October 2011.  (BTW, I think Jason is one draft behind.  Probably my fault...).  
> 
> It's not clear to me whether the current spec allows this:
> 
>  function f(a, b = 5, c, d = 7, e) { }
> 
> If it does, great; that basically matches what I'm proposing WebIDL should do, which is allow putting default values on the optional arguments where they make sense no matter what the argument order is.

Yes it does.  It remains the case in ES6 that all formal parameters are actually "optional".  The only real issue is what initial value they get if a corresponding argument is not present.

> 
>> This is all about determining the "length" value of a function.  Length is the number of required arguments which is defined to be the number of formal parameters to the left of  the first parameter with a default value initializer (or the rest parameter).
> 
> The "length" of a function is an orthogonal (and somewhat simpler, in that it really doesn't matter all that much in practice, imo) issue. Right now we're just talking about what sort of functions are allowed at all.
> 
> -Boris
> 

Received on Tuesday, 18 June 2013 15:52:40 UTC