- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Wed, 28 Aug 2013 12:20:39 -0400
- To: Allen Wirfs-Brock <allen@wirfs-brock.com>
- CC: Joshua Bell <jsbell@google.com>, public-script-coord <public-script-coord@w3.org>
On 8/28/13 11:49 AM, Allen Wirfs-Brock wrote: > Technically, all arguments to any ECMAScript function are optional. Formal parameters, by default, get the value undefined when a corresponding argument is not passed. > > The 'length' property of an ES function is supposed to report the "typical" (ES5 15.3.5.1) number of arguments passed to the function. I see, thank you. So in the WebIDL case that leaves us with an interesting situation. If a new argument is being added but being made optional simply to preserve backwards compat, it might well be that the new "typical" number of arguments should in fact include the new argument.... Would it make sense for WebIDL to default to not including optional arguments in .length but allow explicit length annotations if specifications want to use them, to allow using .length usefully for feature-detection? > Another alternative would be to simply eliminate "optional" from WebIDL and to just directly follow the ES6 conventions. True. The question is what the actual semantics would be for DOM methods then and whether that's backwards-compatible enough... but that would indeed make it clearer in WebIDL which cases are just "foo" (which can be omitted but affects .length) and which are "foo = undefined" (which can be omitted and does not affect .length). The question is whether we can have that distinction, which is currently avaiable in ES, in WebIDL as well, and if so how. > WebIDL shouldn't be looking for a "better" definition of 'length'. In WebIDL we can have metainformation not available to scripted functions about what the "typical" number of arguments for a function is. Should we? > "Better" just means inconsistency There is already inconsistency in the sense that the mapping from WebIDL to concepts like "arguments with initializers" is pretty arbitrary as this thread shows. > For any particular function, how is a Web developer supposed to know if they are look at a WebIDL better length property or a regular ES length property? Let's assume they knew. What would they do with that information? As far as I can see, the primary use of .length is to do detection of which version of a function you're dealing with if the API recently changed. Are there other use cases? > If you want to change the ES meaning of the function 'length" property, TC39 is the place to do it. I don't think I want to change anything for ES functions here, since as you pointed out there is simply not much to go on for deciding on a "length" for them. > Changing it only for WebIDL just makes things worse. I'm not proposing _changing_ anything for WebIDL. I'm trying to figure out what the right way is to map WebIDL to the ES semantics here. Even if we were using ES directly that problem would still be here, because these two ES function declarations: function foo(arg1, arg2) {} function foo(arg1, arg2 = undefined) {} have identical behavior _except_ for .length, as far as I can tell, and one needs to make a conscious choice as to which one to use. -Boris
Received on Wednesday, 28 August 2013 16:21:09 UTC