On Wednesday, June 28, 2017 at 2:21:16 PM UTC+2, Vassilis Virvilis wrote: > > I am not following the implementation details and I cannot judge on the > compromises front. > > But from a user standpoint this should be implemented because a > @JsFunction should generate a js function() and a js function() happens to > have a length member by specification (see > https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/length > > ) > > Otherwise @JsFunction is not a js function() but something callable > instead. >
GWT generates a function, but a function with an empty formal parameter list (and as a result a length of 0), because it simply uses 'arguments': https://github.com/gwtproject/gwt/blob/2.8.1/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Runtime.java#L158-L169 > Given the dynamic number of javascript I expect that these kind of checks > to be common enough to warrant the effort. > One could argue the reverse: due to the dynamic nature of JS, 'length' of a function isn't reliable, and you'd be better off using distinct APIs rather than driving behavior by inferring things from inputs, or more precisely be explicit with your intent. It easily fails you, as soon as you wrap a function to bind, curry, memoize it, whatever, using a generic factory (one that uses 'arguments' along with Function.prototype.apply or Function.prototype.call; one that specifically doesn't use Function.prototype.bind). Have a look at the Function.prototype.bind polyfill from the MDN for example: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill Any code targeting IE8 or older (that doesn't necessarily mean new code) would need this polyfill, and the returned function (fBound) has a length of 0, irrespective of the length of the function to bind. There's a polyfill for Function.prototype.bind that returns a function with the correct 'length', but it uses new Function() with a string body: https://github.com/Raynos/function-bind/blob/83e639ff74e6cd6921285bccec22c1bcf72311bd/implementation.js#L38 so it'd break most CSP. While IE8 doesn't support CSP (so it's OK for this particular polyfill), that however means you cannot use such a trick for other things you'd like to do with a function (such as memoizing it: for example, https://github.com/caiogondim/fast-memoize.js returns a function with length 0 too). -- You received this message because you are subscribed to the Google Groups "GWT Contributors" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/e12e8c02-c6f0-4818-aaee-fb564935e8ec%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
